一个简单的策略,不晓得哪里错了,回测不出东西

 
1小时周期,当前时间12:10,1号K线代表11:00~12:00K线,2号K线表示10:00~11:00K线

1号K线是阳线,且1号收盘价>2号最高价,下一步
2号向前找出第A号K线,A号K线满足 (A号最低价<A-1号最低价)&&(A号最高价<2~A-1号K线最高价的最高值)&&(A号最高价<A+1、A+2号K线最高价的最高值 )&&(A号K线最低价<=A+1,A+2号K线最低价的最低值 )
满足以上条件,确认出现“底分型停顿”,在A号K线最低价下方标注“底”


1号K线是阴线,1号收盘价<2号最低价,下一步
2号向前找出第A号K线,A号K线满足 (A号最高价>A-1号最高价)&&(A号最低价>2~A-1号K线最低价的最低值)&&(A号最高价>=A+1、A+2号K线最高价的最高值 )&&(A号最低价>A+1、A+2号K线最低价的最低值)
满足以上条件,确认出现“顶分型停顿”,在A号K线最高价上方标注“顶”


A的范围  3<=A<=最大值   “最大值”设为外部参数

以上是策略思路,下面是源码

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

extern double 亏损比=0.3;

extern     int 赔率=3;

extern     int 分型停顿参数=7;

int 顶分型停顿顶点位置;

int 底分型停顿顶点位置;

int magic=2126767;

int sip=5;

int OnInit()

  {


   return(INIT_SUCCEEDED);

  }


void OnDeinit(const int reason)

  {


   

  }


void OnTick()

  {

  double jingzhi=AccountEquity();

  if(底分型停顿()==true&&buyzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(Low[底分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]+赔率*(Close[1]-Low[底分型停顿顶点位置]);

  double zhisun=Open[1];

  int tacket1=OrderSend(Symbol(), OP_BUY, danliang, Ask, sip,zhisun, zhiying, "buy", magic, 0, Red);

  }

  if(顶分型停顿()==true&&sellzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(High[顶分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]-赔率*(High[顶分型停顿顶点位置]-Close[1]);

  double zhisun=Open[1];

  int tacket2=OrderSend(Symbol(), OP_SELL, danliang, Bid, sip,zhisun, zhiying, "sell", magic, 0, Blue);

  }

  }

//+------------------------------------------------------------------+

//分型停顿信号判断                                                   |

//+------------------------------------------------------------------+ 

bool  顶分型停顿()    

  {

   bool  出现顶分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]>Open[1] && Low[i]<Low[i-1] && High[i]>High[iHighest(Symbol(),0,MODE_HIGH,i-3,2)] && High[i]<High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]<=Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现顶分型停顿=true;

     顶分型停顿顶点位置=i;

     break;

    }

   return(出现顶分型停顿);

  }

  

bool  底分型停顿( )    

  {

   bool  出现底分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]<Open[1] && High[i]>High[i-1] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,i-3,2)] && High[i]>=High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现底分型停顿=true;

     底分型停顿顶点位置=i;

     break;

    }

   return(出现底分型停顿);

  }

//+------------------------------------------------------------------+

//当前持仓判断                                                       |

//+------------------------------------------------------------------+ 

 int buyzongdanshu()//当前货币对EA自动买单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if( OrderType()==OP_BUY  &&  OrderMagicNumber()==magic)// &&  OrderComment()=="buy" 

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }

 int sellzongdanshu()//当前货币对EA自动卖单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if(  OrderType()==OP_SELL&&OrderMagicNumber()==magic  )// &&  OrderComment()=="sell"

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }



自动交易和策略测试
自动交易和策略测试
  • www.mql5.com
The Synchronized Charts script allows comparing bars of different symbols or different periods of the same symbol. Attach the script to a chart and move bars or change the scale, all opened chart will move synchronously with the current one. The bars on different charts aligned to the border according to their open time. CreateGridOrdersTune A...
 
sheri_lanyue:
请引用代码是用SRC格式发帖,否则,看的人太累。
#property copyright "Copyright 2017, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

extern double 亏损比=0.3;

extern     int 赔率=3;

extern     int 分型停顿参数=7;

int 顶分型停顿顶点位置;

int 底分型停顿顶点位置;

int magic=2126767;

int sip=5;

int OnInit()

  {



   return(INIT_SUCCEEDED);

  }



void OnDeinit(const int reason)

  {



   

  }



void OnTick()

  {

  double jingzhi=AccountEquity();

  if(底分型停顿()==true&&buyzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(Low[底分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]+赔率*(Close[1]-Low[底分型停顿顶点位置]);

  double zhisun=Open[1];

  int tacket1=OrderSend(Symbol(), OP_BUY, danliang, Ask, sip,zhisun, zhiying, "buy", magic, 0, Red);

  }

  if(顶分型停顿()==true&&sellzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(High[顶分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]-赔率*(High[顶分型停顿顶点位置]-Close[1]);

  double zhisun=Open[1];

  int tacket2=OrderSend(Symbol(), OP_SELL, danliang, Bid, sip,zhisun, zhiying, "sell", magic, 0, Blue);

  }

  }

//+------------------------------------------------------------------+

//分型停顿信号判断                                                   |

//+------------------------------------------------------------------+ 

bool  顶分型停顿()    

  {

   bool  出现顶分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]>Open[1] && Low[i]<Low[i-1] && High[i]>High[iHighest(Symbol(),0,MODE_HIGH,i-3,2)] && High[i]<High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]<=Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现顶分型停顿=true;

     顶分型停顿顶点位置=i;

     break;

    }

   return(出现顶分型停顿);

  }

  

bool  底分型停顿( )    

  {

   bool  出现底分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]<Open[1] && High[i]>High[i-1] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,i-3,2)] && High[i]>=High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现底分型停顿=true;

     底分型停顿顶点位置=i;

     break;

    }

   return(出现底分型停顿);

  }

//+------------------------------------------------------------------+

//当前持仓判断                                                       |

//+------------------------------------------------------------------+ 

 int buyzongdanshu()//当前货币对EA自动买单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if( OrderType()==OP_BUY  &&  OrderMagicNumber()==magic)// &&  OrderComment()=="buy" 

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }

 int sellzongdanshu()//当前货币对EA自动卖单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if(  OrderType()==OP_SELL&&OrderMagicNumber()==magic  )// &&  OrderComment()=="sell"

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }


   return(INIT_SUCCEEDED);

  }


void OnDeinit(const int reason)

  {


   

  }


void OnTick()

  {

  double jingzhi=AccountEquity();

  if(底分型停顿()==true&&buyzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(Low[底分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]+赔率*(Close[1]-Low[底分型停顿顶点位置]);

  double zhisun=Open[1];

  int tacket1=OrderSend(Symbol(), OP_BUY, danliang, Ask, sip,zhisun, zhiying, "buy", magic, 0, Red);

  }

  if(顶分型停顿()==true&&sellzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(High[顶分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]-赔率*(High[顶分型停顿顶点位置]-Close[1]);

  double zhisun=Open[1];

  int tacket2=OrderSend(Symbol(), OP_SELL, danliang, Bid, sip,zhisun, zhiying, "sell", magic, 0, Blue);

  }

  }

//+------------------------------------------------------------------+

//分型停顿信号判断                                                   |

//+------------------------------------------------------------------+ 

bool  顶分型停顿()    

  {

   bool  出现顶分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]>Open[1] && Low[i]<Low[i-1] && High[i]>High[iHighest(Symbol(),0,MODE_HIGH,i-3,2)] && High[i]<High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]<=Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现顶分型停顿=true;

     顶分型停顿顶点位置=i;

     break;

    }

   return(出现顶分型停顿);

  }

  

bool  底分型停顿( )    

  {

   bool  出现底分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]<Open[1] && High[i]>High[i-1] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,i-3,2)] && High[i]>=High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现底分型停顿=true;

     底分型停顿顶点位置=i;

     break;

    }

   return(出现底分型停顿);

  }

//+------------------------------------------------------------------+

//当前持仓判断                                                       |

//+------------------------------------------------------------------+ 

 int buyzongdanshu()//当前货币对EA自动买单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if( OrderType()==OP_BUY  &&  OrderMagicNumber()==magic)// &&  OrderComment()=="buy" 

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }

 int sellzongdanshu()//当前货币对EA自动卖单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if(  OrderType()==OP_SELL&&OrderMagicNumber()==magic  )// &&  OrderComment()=="sell"

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }



 
sheri_lanyue:
1小时周期,当前时间12:10,1号K线代表11:00~12:00K线,2号K线表示10:00~11:00K线

1号K线是阳线,且1号收盘价>2号最高价,下一步
2号向前找出第A号K线,A号K线满足 (A号最低价<A-1号最低价)&&(A号最高价<2~A-1号K线最高价的最高值)&&(A号最高价<A+1、A+2号K线最高价的最高值 )&&(A号K线最低价<=A+1,A+2号K线最低价的最低值 )
满足以上条件,确认出现“底分型停顿”,在A号K线最低价下方标注“底”


1号K线是阴线,1号收盘价<2号最低价,下一步
2号向前找出第A号K线,A号K线满足 (A号最高价>A-1号最高价)&&(A号最低价>2~A-1号K线最低价的最低值)&&(A号最高价>=A+1、A+2号K线最高价的最高值 )&&(A号最低价>A+1、A+2号K线最低价的最低值)
满足以上条件,确认出现“顶分型停顿”,在A号K线最高价上方标注“顶”


A的范围  3<=A<=最大值   “最大值”设为外部参数

以上是策略思路,下面是源码

#property copyright "Copyright 2017, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

extern double 亏损比=0.3;

extern     int 赔率=3;

extern     int 分型停顿参数=7;

int 顶分型停顿顶点位置;

int 底分型停顿顶点位置;

int magic=2126767;

int sip=5;

int OnInit()

  {


   return(INIT_SUCCEEDED);

  }


void OnDeinit(const int reason)

  {


   

  }


void OnTick()

  {

  double jingzhi=AccountEquity();

  if(底分型停顿()==true&&buyzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(Low[底分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]+赔率*(Close[1]-Low[底分型停顿顶点位置]);

  double zhisun=Open[1];

  int tacket1=OrderSend(Symbol(), OP_BUY, danliang, Ask, sip,zhisun, zhiying, "buy", magic, 0, Red);

  }

  if(顶分型停顿()==true&&sellzongdanshu()==0)

  {

  double danliang=jingzhi*亏损比/1000/(High[顶分型停顿顶点位置]-Close[1]);

  double zhiying=Close[1]-赔率*(High[顶分型停顿顶点位置]-Close[1]);

  double zhisun=Open[1];

  int tacket2=OrderSend(Symbol(), OP_SELL, danliang, Bid, sip,zhisun, zhiying, "sell", magic, 0, Blue);

  }

  }

//+------------------------------------------------------------------+

//分型停顿信号判断                                                   |

//+------------------------------------------------------------------+ 

bool  顶分型停顿()    

  {

   bool  出现顶分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]>Open[1] && Low[i]<Low[i-1] && High[i]>High[iHighest(Symbol(),0,MODE_HIGH,i-3,2)] && High[i]<High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]<=Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现顶分型停顿=true;

     顶分型停顿顶点位置=i;

     break;

    }

   return(出现顶分型停顿);

  }

  

bool  底分型停顿( )    

  {

   bool  出现底分型停顿=false;

   for(int i=3;i<分型停顿参数;i++)

    {

     if(Close[1]<Open[1] && High[i]>High[i-1] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,i-3,2)] && High[i]>=High[iHighest(Symbol(),0,MODE_HIGH,1,i+1)] && Low[i]>Low[iLowest(Symbol(),0,MODE_LOW,1,i+1)])

     出现底分型停顿=true;

     底分型停顿顶点位置=i;

     break;

    }

   return(出现底分型停顿);

  }

//+------------------------------------------------------------------+

//当前持仓判断                                                       |

//+------------------------------------------------------------------+ 

 int buyzongdanshu()//当前货币对EA自动买单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if( OrderType()==OP_BUY  &&  OrderMagicNumber()==magic)// &&  OrderComment()=="buy" 

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }

 int sellzongdanshu()//当前货币对EA自动卖单总单数

  {

    int a=0;

     for(int i=0;i<OrdersTotal();i++)

               {

                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

                     {

                       if( OrderSymbol()==Symbol() )    

                         {  

                           if(  OrderType()==OP_SELL&&OrderMagicNumber()==magic  )// &&  OrderComment()=="sell"

                              { a=a+1;  }                 

                         } 

                      }

               }

     return(a);

  }



 用print 写在开仓条件下面,做测试时,看吐出来的内容是否满足开仓条件。如果没有吐出来,那,你的开仓条件是无法满足的。所以没有订单也就无法测试。
原因: