初學程式求救

 

我有買一本程式的書籍,但感覺好難

想說先懂一些簡單程式

想請問一下

假如我用的是分線,

"收盤突破今天最高就買進,收盤跌破今天最低就賣出"

請老手指導一下 讓我跨出一小步 

感謝

 

請參考大大的範例

https://www.mql5.com/zh/forum/314015

新手 想建立一個五日高點突破的EA 懇請指點一二
新手 想建立一個五日高點突破的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
 } 
 //+----------------------------------------------- -------------------+ 
 
最简单的办法就是报一个课程班学习,有老师教比自己摸索学得快得多。
原因: