請參考大大的範例

新手 想建立一個五日高點突破的EA 懇請指點一二
- 2019.05.22
- www.mql5.com
//想建立一個五日高點突破的買進訊號 // 五日低點跌破的賣出訊號 //請問大大要如何寫呢? //懇請指點一二 謝謝 //ps...
Kevin Z:
首先需要定義何謂日高日低
我有買一本程式的書籍,但感覺好難
想說先懂一些簡單程式
想請問一下
假如我用的是分線,
"收盤突破今天最高就買進,收盤跌破今天最低就賣出"
請老手指導一下 讓我跨出一小步
感謝
謝謝各位回復 我會在研究一下
有這論壇還不錯,學程式不在是一個人QQ
EA出訊號 並同時利用內建的MT5社群軟體發通知 常常會沒收到 可能是什麼原因呢?
//+----------------------------------------------- -------------------+ //| 引用資料庫 //+----------------------------------------------- -------------------+ #include <Trade\Trade.mqh> //包含執行的交易庫 #include <Trade\PositionInfo.mqh> //包含部位的資訊庫 CTrade m_Trade; //執行交易的結構體 CPositionInfo m_Position; //獲取持倉信息的結構體 //+----------------------------------------------- -------------------+ //| input與全域?參數宣告 (F3可監控?) //| 前置k或是褐色字,代表為input //+----------------------------------------------- -------------------+ input int kLav , kSav , kPav ; //av為移動平均 int Lav= kLav , Sav = kSav, Pav=kPav; input double 停利率 = 0.01, k目前成本 =0 ; input double 下單量 = 0.01; input int 偏差值 = 99,睡覺 = 999; double 目前成本 = k目前成本 , 目前獲利; input int 已有部位 = 0; //已有部位 : 多填1,空填-1,空手填0 int posGI , Pos = 已有部位, pPos = 已有部位; bool SendNotification ,Redone ; int CLoc, pCLoc, SLoc, pSLoc; //Loc為位置 int CheckNewBar, Kcount, pKcount; input int 開倉限制 = 0 ; // 開倉限制 : 全都做 → 0 ; 只做多 → 1 ; 只做空 → -1 int iMA1_handle, iMA2_handle, iMA3_handle; //存儲句柄變量 double iMA1_buf[],iMA2_buf[], iMA3_buf[], Close_buf[]; //存儲每個柱形收盤價格的動態數組 string 間接商品名稱 ; input int 偵測倉位 = 1 ; // 偵測倉位 : 「是」填1,「否」填0 input int 自動均線參數 = 1 ; // 自動均線參數 : 「是」填1,「否」填0 //+----------------------------------------------- -------------------+ //|參數調整、部位檢查、建構句柄、圖表、等事項 //+----------------------------------------------- -------------------+ int OnInit () { if (偵測倉位 == 1 && 已有部位 ==0 ) //部位偵測開始 { PositionSelect(_Symbol); posGI== -1; 目前成本 = PositionGetDouble(POSITION_PRICE_OPEN); if(目前成本 != 0) { posGI = PositionGetInteger(POSITION_TYPE); if(posGI== 0) { Pos= 1 ;pPos= 1 ;} //buy if(posGI== 1) { Pos= -1 ;pPos= -1 ;} //sell } }//部位偵測結束 //oneEA run 4 symbol ok? 間接商品名稱 = StringSubstr(Symbol(),0,3); // 小心KGI 最後有s if(自動均線參數 == 1) //自動參數調整 & 手動輸入倉位相關資訊 (可防止重開機重複下單) { if(間接商品名稱 == "EUR" ) {Lav = 1040 ; Sav = 160;目前成本 = 1.1243 ; Pos = -1 ; pPos = -1;} //更新日期: if(間接商品名稱 == "GBP" ) {Lav = 610 ; Sav = 180;目前成本 = 1.2656 ; Pos = -1 ; pPos = -1;} //更新日期: 7/5 16:09 有部位 但沒停利! if(間接商品名稱 == "AUD" ) {Lav = 530 ; Sav = 390;目前成本 = 0 ; Pos = 0 ; pPos = 0 ; pCLoc = 2;} //更新日期: 7/5 16:11 已停利 if(間接商品名稱 == "USD" ) {Lav = 840 ; Sav = 220;目前成本 = 108.572 ; Pos = 1 ; pPos = 1;} // 目前成本 = ; iPos = ; pPos = ; pCLocation = ; //第1代 最大獲利 //歐元 660 60 10 1% //英鎊 320 180 10 1% //澳幣 1160 160 10 1% //日幣 360 130 10 1% //第2代 最小MDD //歐元 160 1040 10 1% 55.08 128 //英鎊 180 610 10 1% 86.28 130 //日幣 390 530 10 1% 143.79 123 //澳幣 220 840 10 1% 38.53 105 } iMA1_handle= iMA (Symbol(),Period(), Sav , 0 , MODE_SMA , PRICE_CLOSE ); //獲取指標句柄 iMA2_handle= iMA (Symbol(),Period(), Lav , 0 , MODE_SMA , PRICE_CLOSE ); //獲取指標句柄 iMA3_handle= iMA (Symbol(),Period(), Pav , 0 , MODE_SMA , PRICE_CLOSE ); //獲取指標句柄 if (iMA1_handle== INVALID_HANDLE ||iMA2_handle== INVALID_HANDLE ||iMA3_handle== INVALID_HANDLE ) //檢查指標句柄是否可用 { Print ( "Failed to get the indicator handle" ); //如果句柄沒有獲取到,打印相關報錯信息到日誌文件中 return (- 1 ); //完成報錯處理 ??? } ChartIndicatorAdd ( ChartID (), 0 ,iMA1_handle); //將指標添加到價格圖表中 ChartIndicatorAdd ( ChartID (), 0 ,iMA2_handle); //將指標添加到價格圖表中 ChartIndicatorAdd ( ChartID (), 0 ,iMA3_handle); //將指標添加到價格圖表中 ArraySetAsSeries (iMA1_buf, true ); //將數組的索引設置為時間序列 ArraySetAsSeries (iMA2_buf, true ); //將數組的索引設置為時間序列 ArraySetAsSeries (iMA3_buf, true ); //將數組的索引設置為時間序列 ArraySetAsSeries (Close_buf, true ); //將Close_buf數組的索引設置為時間序列 return ( 0 ); //返回0,初始化結束 } //+----------------------------------------------- -------------------+ //| EA去初始化函數| 刪除指標句柄並釋放存儲空間、釋放動態數組 //+----------------------------------------------- -------------------+ void OnDeinit ( const int reason) { IndicatorRelease (iMA1_handle); IndicatorRelease (iMA2_handle); IndicatorRelease (iMA3_handle); ArrayFree (iMA1_buf); ArrayFree (iMA2_buf); ArrayFree (iMA3_buf); ArrayFree (Close_buf); } //+----------------------------------------------- -------------------+ //| EA的tick函數| //+----------------------------------------------- -------------------+ void OnTick () { // 16385 → 1H 16388 → 4H 16408 → D1 string KK =_Period; if( _Period == 16385){KK= "60";} if( _Period == 16388){KK= "4H";} if( _Period == 16408){KK= "D1";} int err1= 0 , err2= 0, err3= 0,err4= 0 ; //用於存儲價格圖表處理結果的變量 err1= CopyBuffer (iMA1_handle, 0 , 0 , 2 ,iMA1_buf); //將指標數據拷貝到動態數組,以進一步處理 err2= CopyBuffer (iMA2_handle, 0 , 0 , 2 ,iMA2_buf); //將指標數據拷貝到動態數組,以進一步處理 err3= CopyBuffer (iMA3_handle, 0 , 0 , 2 ,iMA3_buf); //將指標數據拷貝到動態數組,以進一步處理 err4= CopyClose (Symbol(),Period(), 0 , 2 ,Close_buf); //將價格數據拷貝到動態數組,以進一步處理 if (err1< 0 || err2< 0 || err3< 0 || err4< 0 ) //如果出錯 { Print ( "Failed to copy data from buffer or price " ); //打印相關錯誤信息到日誌文件 return ; //並退出函數 } Kcount = SeriesInfoInteger (Symbol(), Period(), SERIES_BARS_COUNT); if (Kcount == 0) pKcount = Kcount; if (pKcount == pKcount ) CheckNewBar = 0 ; if (pKcount != Kcount ) CheckNewBar = 1 ; //確認新k棒給1 if (CheckNewBar == 1 ) //////////////新Bar後動作 超大if { int 建議停損最大點數 = MathAbs(((iMA1_buf[1] - iMA2_buf[1]))*10000); int 建議日幣停損 = MathCeil(建議停損最大點數*Close_buf[ 1 ]*0.0001); CLoc=0; //會有剛好等於的嗎? if (Close_buf[ 1 ]>=iMA1_buf[ 1 ]) CLoc= 1+CLoc; if (Close_buf[ 1 ]>=iMA2_buf[ 1 ]) CLoc= 1+CLoc; if (Close_buf[ 1 ]< iMA1_buf[ 1 ]) CLoc=-1+CLoc; if (Close_buf[ 1 ]< iMA2_buf[ 1 ]) CLoc=-1+CLoc; SLoc=0; if (Close_buf[ 1 ]>=iMA3_buf[ 1 ]) SLoc= 1+SLoc; if (Close_buf[ 1 ]< iMA3_buf[ 1 ]) SLoc=-1+SLoc; //做多_平空單 if (Pos < 0 && CLoc==2 && pCLoc <=0 ) { Redone=true; do { m_Trade.PositionClose( Symbol(),偏差值); Sleep(睡覺); Print(Symbol(), "做多_平空單 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); if(m_Trade.ResultRetcode()==10009) Redone = false ; if(m_Trade.ResultRetcode()==10036) Redone = false ; } while(Redone); Pos=0; ; } //做多_淨多單 if (Pos== 0 && CLoc==2 && pCLoc <=0 && 開倉限制>= 0) { Redone=true; do { m_Trade.Buy( 下單量 ,Symbol(),0.0,0.0,0.0,"做多_淨多單");Sleep(睡覺); Print(Symbol(), "做多_淨多單 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); } while(m_Trade.ResultRetcode()!=10009); Pos=1; 目前成本= Close_buf[ 1 ]; } if( Pos > pPos && CLoc == 2 ) { if(Symbol()!="USDJPY") { SendNotification( StringSubstr(Symbol(),0,3) + "\n" + "站上 " +Sav + " 與 " +Lav + " 均線 ( " + KK + " 分K線 )" +"\n" + "請務必評估自身風險承受度與資金控管,善設停損。" + "\n"+ "建議最大停損點數 : " + 建議停損最大點數*0.0001 ); } if(Symbol()=="USDJPY") { SendNotification( StringSubstr(Symbol(),3,3) + "\n" + "跌破 " +Sav + " 與 " +Lav + " 均線 ( " + KK + " 分K線 )" +"\n" + "請務必評估自身風險承受度與資金控管,善設停損。" + "\n"+ "建議最大停損點數 : " + 建議日幣停損 ); } } //做空_平多單 if (Pos > 0 && CLoc==-2 && pCLoc >=0 ) { Redone=true;do { m_Trade.PositionClose(Symbol(),偏差值);Sleep(睡覺); Print(Symbol(), "做空_平多單 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); if(m_Trade.ResultRetcode()==10009) Redone = false ; if(m_Trade.ResultRetcode()==10036) Redone = false ; } while(Redone); Pos=0; } //做空_淨空單 if (Pos == 0 && CLoc==-2 && pCLoc >=0 && 開倉限制<= 0 ) { Redone=true;do { m_Trade.Sell( 下單量 ,Symbol(),0.0,0.0,0.0,"做空_淨空單"); Sleep(睡覺); Print(Symbol(), "做空_淨空單 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); } while(m_Trade.ResultRetcode()!=10009); Pos=-1; 目前成本= Close_buf[ 1 ]; } if (Pos < pPos && CLoc == -2 ) { if(Symbol()!="USDJPY") { SendNotification( StringSubstr(Symbol(),0,3) + "\n" + "跌破 " +Sav + " 與 " +Lav + " 均線 ( " + KK + " 分K線 )" +"\n" + "請務必評估自身風險承受度與資金控管,善設停損。" + "\n"+ "建議最大停損點數 : " + 建議停損最大點數*0.0001 ); } if(Symbol()=="USDJPY") { SendNotification( StringSubstr(Symbol(),3,3) + "\n" + "站上 " +Sav + " 與 " +Lav + " 均線 ( " + KK + " 分K線 )" +"\n" + "請務必評估自身風險承受度與資金控管,善設停損。" + "\n"+ "建議最大停損點數 : " + 建議日幣停損 ); } } //停利 if( Pos >0 ) { 目前獲利 = (Close_buf[ 1 ] - 目前成本 )/Close_buf[ 1 ] ; } if( Pos <0 ) { 目前獲利 = ( 目前成本 - Close_buf[ 1 ] )/Close_buf[ 1 ] ; } if (Pos == -1 && (目前獲利 >= 停利率 )&& SLoc==1 && pSLoc<=0) { Redone=true;do { m_Trade.PositionClose( Symbol(),偏差值); Sleep(睡覺); Print(Symbol(), "多單_停利 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); if(m_Trade.ResultRetcode()==10009) Redone = false ; if(m_Trade.ResultRetcode()==10036) Redone = false ; } while(Redone); Pos=0; if(Symbol()!="USDJPY")SendNotification( StringSubstr(Symbol(),0,3) + "乖離較大建議觀望"); if(Symbol()=="USDJPY")SendNotification( StringSubstr(Symbol(),3,3) + "乖離較大建議觀望"); } if (Pos == 1 && (目前獲利 >= 停利率 )&& SLoc== -1 && pSLoc>=0) { Redone=true; do { m_Trade.PositionClose( Symbol(),偏差值);Sleep(睡覺); Print(Symbol(), "空單_停利 = ",m_Trade.ResultRetcode()+". Code description: ",m_Trade.ResultRetcodeDescription()); if(m_Trade.ResultRetcode()==10009) Redone = false ; if(m_Trade.ResultRetcode()==10036) Redone = false ; } while(Redone); Pos=0; if(Symbol()!="USDJPY")SendNotification( StringSubstr(Symbol(),0,3) + "乖離較大建議觀望"); if(Symbol()=="USDJPY")SendNotification( StringSubstr(Symbol(),3,3) + "乖離較大建議觀望"); } //資訊轉下一個K棒 pPos = Pos; pKcount = Kcount ; pCLoc= CLoc ; pSLoc = SLoc; }//////////////新Bar 超大if } //+----------------------------------------------- -------------------+
最简单的办法就是报一个课程班学习,有老师教比自己摸索学得快得多。
我有買一本程式的書籍,但感覺好難
想說先懂一些簡單程式
想請問一下
假如我用的是分線,
"收盤突破今天最高就買進,收盤跌破今天最低就賣出"
請老手指導一下 讓我跨出一小步
感謝