『最佳拍檔』智能決策系統

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10864|回复: 4

[技巧] 如何利用 ESUNNY + EXCEL VBA 發出 EMAIL!

[复制链接]
发表于 2017-10-2 11:54:29 | 显示全部楼层 |阅读模式
QQ截图20171002115524.jpg

如何利用 ESUNNY + EXCEL VBA 發出 EMAIL !

ESUNNY_OUTPUT_SIGNAL_TO_EMAIL.jpg

源碼 ETL : 20171019_OutputSignalToFile_Esunny.esl (10.23 KB, 下载次数: 42)  

 可使用成品 DLL : 20171019_OutputSignalToFile.dll (108.5 KB, 下载次数: 31)

EXCEL VBA :  20171108_VBA_SENDEMAIL_office2007.xlsm (139.08 KB, 下载次数: 31)

EXCEL VBA :   20171108_VBA_SENDEMAIL_office365.xlsm (129.62 KB, 下载次数: 15)

WAV Samples :   WAV_samples.rar (3.21 MB, 下载次数: 1055)

由於有朋友用OFFICE 365  
但這類OFFICE 係 64BIT 版本, 所以舊式VBA 32BIT 會不能運行
一定要改程式碼先可以, 所以我分開兩個版本, 
有須要朋友可以下載對應的使用 !!

注意: 例子是用GMAIL 設定

用法很簡單,
於EXCEL 表中EMAILsetup 頁設定好自己的 GMAIL A/C & PW
SAVE 後, 基本上只要開啟住此EXCEL 表,
都會自動到指定目錄讀取INI 檔案內容, e.g. c:\CSV\test.ini

而於Esunny 中只要有一幅圖表己加載了 "OutputSignalToFile" 指標,
便會自動讀寫指定目錄INI 檔案內容 e.g. c:\CSV\test.ini (當然要與EXCEL 設定一樣)

當ESUNNY 圖表有買或沽訊號時, 便會寫到 test.ini 內,
EXCEL VBA 會自動讀取, 並記錄下來及發出 EMAIL,
直至你停止佢或關閉才會停止檢查 test.ini 內容。

OutputSignalToFile_選項.jpg

OutputSignalToFile 條公式有基本3個例子指標可供使用,
1) MA CROSS;
2) MACD;
3) RSI;

源碼己放於論壇, 有須要朋友可以自行增加其它指標使用。

QQ截图20171002115121.jpg

QQ截图20171002115149.jpg
201711 
新增 可出提示響聲 Alert Sound, 及彈窗

Alert Sound 指定使用 WAV 檔案, 放置路徑可以自定, 
WAV 檔案名稱, 使用 "指定指標名" + "BUY"  / "SELL"  + "WAV"

只要於指定目錄中自行放置對應名WAV 檔便可以,
當有對應指標, 可以對應到WAV 檔案, 就會自動取用。

而彈窗提示, 於 EMAILsetup 頁, 可以設定自動消失時間, 秒數做單位,
就算不按下確定, 都會於倒數後自動消失彈窗。

SOUND_WAV.jpg


QQ截图20171002115219.jpg

QQ截图20171002120912.jpg

 
//------------------------------------------------------------------------
// 简称:OutputSignalToFile
// 名称:輸出訊號到文檔
// 类别: 交易指令
// 类型: 用户应用
//www.bp-system.com
//Created By Matthew AY
//20171017
//------------------------------------------------------------------------
Params 
//参数定义
String Path("C:\\CSV\\test.ini") ;//記錄路徑
//
Bool Id_MA(True) ;//啟用選項
//
Numeric FastMA1(5) ;  //均线 1 周期
String  MA1_SWE("S") ; //S=SMA W=WMA E=EMA
Numeric SlowMA2(35) ;  //均线 2 周期
String  MA2_SWE("S") ; //S=SMA W=WMA E=EMA
Numeric MA_AfterConfirm(0) ; //訊號後X支燭做 0=不使用 1=訊號後1支 
// 
Bool Id_MACD(True) ;//啟用選項
//
Integer LongPrd(26) ; //快線 EMA
Integer ShortPrd(12) ;//慢線 EMA
Integer M(9) ;        //SMA
Numeric MACD_AfterConfirm(0) ; //訊號後X支燭做 0=不使用 1=訊號後1支
//
Bool Id_RSI(True) ;//啟用選項
Integer N1(6) ; //RSI 平均周期
Integer RSI_TopLine(90) ; //RSI 上線跌穿沽
Integer RSI_BotLine(10) ; //RSI 下線升穿買
Numeric RSI_AfterConfirm(0) ; //訊號後X支燭做 0=不使用 1=訊號後1支
//
String Id_Tradeset("Tradeset") ;//ID無意思只用於分開選項
//
Numeric TradeUint(1) ; //每次交易手数
//
Numeric StopPoint(0) ;  //止损点 0 = 不使用
Numeric WinPoint(0) ;   //止赢点 0 = 不使用
//
Numeric FlostStopStartPoint(0) ;   //浮动止损启动条件 0 = 不使用
Numeric FlostStopPoint(20) ;   //浮动止损点
//
GlobalVars
//全局变量定义 
String GBMyStr2;  
String GBMyStr3; 
  
String GSMyStr2;  
String GSMyStr3;  
//
Vars
//局部变量定义 
String Section;
//
String BMyStr;  
String BMyStr2;  
String BMyStr3; 
String BMyStr4; 
String SMyStr;  
String SMyStr2;  
String SMyStr3;   
String SMyStr4;  
//
String Inidicator;
String BSignal;
String SSignal;
//
Bool bCrossOver;
Bool bCrossDn; 
Begin

Section = Symbol; //記錄區段名
//--------------------------------
// 取得INI 現記錄, 於ESUNNY LOG FILE 中顯示用
BMyStr = GetELProfileString2File(Path,Section,"BuyInidicator") ; 
BMyStr2 = GetELProfileString2File(Path,Section,"BuySignal") ; 
BMyStr3 = GetELProfileString2File(Path,Section,"BuyTime") ; 
BMyStr4 = GetELProfileString2File(Path,Section,"BInterval") ; 
//
SMyStr = GetELProfileString2File(Path,Section,"SellInidicator") ; 
SMyStr2 = GetELProfileString2File(Path,Section,"SellSignal") ; 
SMyStr3 = GetELProfileString2File(Path,Section,"SellTime") ;
SMyStr4 = GetELProfileString2File(Path,Section,"SInterval") ; 
//
If (BarStatus == 2 )
{//歷史K線跳過, 最後一支K線才做
If ( GBMyStr2 != BMyStr2 And GBMyStr3 != BMyStr3 )
{
Print("BuyInidicator: BMyStr " + BMyStr) ;
Print("BuySignal: BMyStr2 " +  BMyStr2 ) ;
Print("BuyTime: BMyStr3 " + BMyStr3) ;
Print("BInterval: BMyStr4 " + BMyStr4) ;
GBMyStr2 = BMyStr2;
GBMyStr3 = BMyStr3;
}
If ( GSMyStr2 != SMyStr2  And GSMyStr3 != SMyStr3  )
{
Print("SellInidicator: SMyStr " + SMyStr) ;
Print("SellSignal: SMyStr2 " +  SMyStr2 ) ;
Print("SellTime: SMyStr3 " + SMyStr3) ;
Print("SInterval: SMyStr4 " + SMyStr4) ;
GSMyStr2 = SMyStr2;
GSMyStr3 = SMyStr3;
}    
}
//****************************
// 重設BUY SELL 訊號
bCrossOver = False;
bCrossDn = False;
 
//****************************  
//888888888888888888888888888888888888888888888888888
//-----【主要策略計算區】【開始】------------- 
//------------------
//-----【 MA 】-----
//------------------  
//-------【FastMA1 開始】-------

  Numeric MA1_Num ;
  Numeric MA1_SMA = AverageFC(CLOSE,FastMA1) ;
  Numeric MA1_WMA = WAverage(CLOSE,FastMA1) ;
  Numeric MA1_EMA = XAverage(CLOSE,FastMA1) ;
  
  if (MA1_SWE == "W" or MA1_SWE == "w") 
  {//WMA
  MA1_Num = MA1_WMA;  
  } 
  Else if (MA1_SWE == "E" or MA1_SWE == "e") 
  {//EMA
  MA1_Num = MA1_EMA;  
  } 
  Else
  {//SMA 
  // 當 MA_SWE 輸入其它字都當作SMA 
  MA1_Num = MA1_SMA;  
  }
//-------【SlowMA2 開始】-------
  Numeric MA2_Num ;
  Numeric MA2_SMA = AverageFC(CLOSE,SlowMA2) ;
  Numeric MA2_WMA = WAverage(CLOSE,SlowMA2) ;
  Numeric MA2_EMA = XAverage(CLOSE,SlowMA2) ;
  
  if (MA2_SWE == "W" or MA2_SWE == "w") 
  {//WMA
  MA2_Num = MA2_WMA;  
  } 
  Else if (MA2_SWE == "E" or MA2_SWE == "e") 
  {//EMA
  MA2_Num = MA2_EMA;  
  } 
  Else
  {//SMA 
  // 當 MA_SWE 輸入其它字都當作SMA 
  MA2_Num = MA2_SMA;  
  }
//--------------------    
PlotNumeric("MA1",MA1_Num,Blue) ;
PlotNumeric("MA2",MA2_Num,Green) ;
//------------------ 
 
 
Bool MAbuy = CrossOver(MA1_Num,MA2_Num ) ;
Bool MAsell = CrossUnder(MA1_Num,MA2_Num ) ;
Bool MAbuyX = REF(CrossOver(MA1_Num,MA2_Num ),MA_AfterConfirm) ;
Bool MAsellX = REF(CrossUnder(MA1_Num,MA2_Num ),MA_AfterConfirm) ;
 
If (MA_AfterConfirm > 0)
{// X 燭確認後
MAbuy = MAbuyX;
MAsell = MAsellX;
//
if ( Id_MA == False )
MAbuy = False  ;
MAsell = False ;
}  
//---------
//CHECK SIGNAL -> String
//MA
if (MAbuy == True or MAsell == True)
{  
    Inidicator = "( "+ MA1_SWE + "MA:" + 
             Text(FastMA1) + "," + 
MA2_SWE + "MA:" + 
"," + Text(SlowMA2) + " )"; 
}
//------------------
//-----【MA  End】-
//************************
//************************
//------------------
//-----【MACD】-----
//------------------
Numeric DIFF = EMA(Close,ShortPrd) - EMA(Close,LongPrd) ;
Numeric DEA = EMA(DIFF,M) ;
Numeric ret = 2*(DIFF-DEA) ;
PlotNumeric("DIFF",DIFF) ;
PlotNumeric("DEA",DEA) ;
 
//由於MACD 不能同一窗顯示, 所以只取訊號
  /*
if(ret > 0)
{
PlotStickLine("MACD",ret,0,ColorUp()) ;
}
Else
{
PlotStickLine("MACD",ret,0,ColorDown()) ;
SetOwnAxis("DIFF") ;
SetOwnAxis("DEA") ;
SetOwnAxis("MACD") ;
*/
Bool MACDbuy =  CrossOver(DIFF,DEA) ; 
Bool MACDsell =  CrossUnder(DIFF,DEA) ;
Bool MACDbuyX =  REF(CrossOver(DIFF,DEA),MACD_AfterConfirm) ;
Bool MACDsellX =  REF(CrossUnder(DIFF,DEA),MACD_AfterConfirm) ;
If (MACD_AfterConfirm > 0)
{// X 燭確認後 
MACDbuy =  MACDbuyX ;  
MACDsell =  MACDsellX  ;
//
If (Id_MACD == False)
{
MACDbuy =  False ;  
MACDsell =  False;
}
 
//CHECK SIGNAL -> String
//MACD
if (MACDbuy == True or MACDsell == True)
{  
/* Integer LongPrd(26) ; //快線 EMA
Integer ShortPrd(12) ;//慢線 EMA
Integer M(9) ;        //SMA*/
    Inidicator =  "( MACD:" + Text(LongPrd) + 
             " "+  Text(ShortPrd) + 
             " " + Text(M) + " )";
}
//------------------
//-----【MACD End】-
//------------------
//************************
//************************
//------------------
//-----【 RSI 】-----
//------------------
/*
String Id_RSI("RSI") ;//ID無意思只用於分開選項
Integer N1(6) ; //RSI 平均周期
Integer RSI_TopLine(90) ; //RSI 上線跌穿沽
Integer RSI_BotLine(10) ; //RSI 下線升穿買
*/
Numeric LC = REF(CLOSE,1) ;
Numeric RSI1 =SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
//由於RSI 不能同一窗顯示, 所以只取訊號
/*
PlotNumeric("RSI1",RSI1) ;
PlotNumeric("top", 100 ) ;
PlotNumeric("mid", 50 ) ;
PlotNumeric("bot", 0 ) ;
PlotText( 100 ,  "100%") ;
PlotText( 0 ,  "0%") ;
PlotText( RSI1 ,  "RSI:"+ text(round(RSI1,0))) ;
UnPlotText(1) ;
*/
Bool RSIbuy =  CrossOver(RSI1,RSI_BotLine) ;
Bool RSIsell =  CrossUnder(RSI1,RSI_TopLine) ;
Bool RSIbuyX =  REF(CrossOver(RSI1,RSI_BotLine), RSI_AfterConfirm) ;
Bool RSIsellX =  REF(CrossUnder(RSI1,RSI_TopLine), RSI_AfterConfirm) ;
If (MACD_AfterConfirm > 0)
{// X 燭確認後 
RSIbuy = RSIbuyX;  
RSIsell = RSIsellX;
//
If ( Id_RSI == False)
{
RSIbuy =  False;  
RSIsell =  False;
}
//CHECK SIGNAL -> String
//RSI
if (RSIbuy == True or RSIsell == True)
{  

    Inidicator =  "( RSI:" + Text(N1) + 
             " "+  Text(RSI_TopLine) + 
             " " + Text(RSI_BotLine) + " )"; 
}
//------------------
//-----【RSI End】-
//------------------
//************************
//*************************


//------------------------------------ 
//-- 所有條件最後訊號表達位置 ------- 後續自己用 OR 加上去

//註: 留意如果啟動 AUTOTRADE 真的會有買賣能力
if (MAbuy == True Or MACDbuy == True Or RSIbuy  == True )
{  
BSignal = "Buy";
SSignal = "Waiting";
//買入指令, 目的圖表上顯示箭頭用
Buy(TradeUint,Open) ; 
}
Else if (MAsell == True Or MACDsell == True  Or RSIsell == True )
BSignal = "Waiting";
SSignal = "Sell";
//沽出指令, 目的圖表上顯示箭頭用
SellShort(TradeUint,Open) ; 
}
Else 
{  
BSignal = "Waiting";
SSignal = "Waiting";
}  
//---------
//---------  
//****************************
//[test]
If (BarStatus == 2 )
{
//跳過歷史數據, 只在最後一支K線開始記錄
//將產品代號當作 Section 標籤, 記錄入指定"INI" 檔案, 目的給EXCEL VBA 讀取, 再發 CDO EMAIL
//Path
//Section
//Inidicator
//BUY 號資料數據
if (Inidicator != BMyStr or BSignal != BMyStr2) 
{
SetELProfileString2File(Path,Section,"BuyInidicator",Inidicator) ;
SetELProfileString2File(Path,Section,"BuySignal",BSignal) ;
SetELProfileString2File(Path,Section,"BuyTime",Text(Time)) ;
SetELProfileString2File(Path,Section,"BInterval",Text(BarInterval)) ;
Print("BuyInidicator: " + Inidicator) ; 
Print("BuySignal: " +  BSignal ) ;
Print("BuyTime: " + Text(Time)) ;  
Print("BInterval: " + Text(BarInterval)) ; 
}  

//SELL 號資料數據 
if (Inidicator != SMyStr or SSignal != SMyStr2) 
{
SetELProfileString2File(Path,Section,"SellInidicator",Inidicator) ;
SetELProfileString2File(Path,Section,"SellSignal",SSignal) ;
SetELProfileString2File(Path,Section,"SellTime",Text(Time)) ;
SetELProfileString2File(Path,Section,"SInterval",Text(BarInterval)) ;
Print("SellInidicator: " + Inidicator) ; 
Print("SellSignal: " +  SSignal ) ;
Print("SellTime: " + Text(Time)) ; 
}
// 
}
//  
//****************************

//止盈止损
if (WinPoint > 0 )
{
SetWinPoint(WinPoint) ;
}
//止损点
if (StopPoint > 0 )
{
SetStopPoint(StopPoint) ;
}
//浮动止损
if (FlostStopStartPoint > 0 )
{
SetFloatStopPoint(FlostStopStartPoint,FlostStopPoint) ;
}
//www.bp-system.com
//Created By Matthew AY
//
End

 楼主| 发表于 2017-10-3 18:08:40 | 显示全部楼层

VBA EXCEL 如何轉用記錄及發出其它產品月份 EMAIL ?

VBA EXCEL 如何轉用記錄及發出其它產品月份 EMAIL ?

只要於ESUNNY 上用快速填單方法, 取得產品名, 
再將產品名抄到EXCEL 上貼上, 便可以~

因為預設 ESUNNY 的 OutputSignalToFile.dll  策略, 會自動將不同產品名, 作為 Section 分開記錄。


QQ截图20171003180804.jpg


轉代號.jpg

 楼主| 发表于 2017-10-17 16:38:55 | 显示全部楼层
 
有朋友話想 確認後先 SEND EMAIL, 
其實唔須要改EXCEL, 反而要改ESUNNY 條公式便可以~

己更新附件 DLL 及 ETL 
 楼主| 发表于 2017-10-24 01:19:56 | 显示全部楼层

相同訊號的限制重發次數

20171024_新增限制同訊號次數.jpg


20171024_新增:
相同訊號的限制重發次數

但不影响 ShtLog 記錄, 只是不發 EMAIL ~
 楼主| 发表于 2017-11-6 23:25:55 | 显示全部楼层
201711 
新增 可出提示響聲 Alert Sound, 及彈窗

Alert Sound 指定使用 WAV 檔案, 放置路徑可以自定, 
WAV 檔案名稱, 使用 "指定指標名" + "BUY"  / "SELL"  + "WAV"

只要於指定目錄中自行放置對應名WAV 檔便可以,
當有對應指標, 可以對應到WAV 檔案, 就會自動取用。

而彈窗提示, 於 EMAILsetup 頁, 可以設定自動消失時間, 秒數做單位,
就算不按下確定, 都會於倒數後自動消失彈窗。

QQ截图20171002115219.jpg

SOUND_WAV.jpg



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|『最佳拍檔』智能決策系統

GMT+8, 2024-3-29 10:18 , Processed in 0.261921 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表