[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 628

 
IgorM:

没有参数的for语句?- 第二个问题是,EA有全局变量--而不是终端,它们在所有函数之前的代码的最开始被描述,包括你写的start()函数--在start()函数被调用时,你的 flagchange = false; 然后你试图将这个标志与之前的状态进行比较,但其状态将永远是false。

如果你刚刚开始尝试你的手 - 从Kodobase采取任何现成的专家顾问,并将进入市场的条件改为你自己的 - 这将是更快。


Vinin
循环的目的是什么?

你的意思是,start()函数在每个tick都被执行?那么这个循环就真的没有必要了。

 

MarkTrade:

那么,start()函数是在每个刻度线上执行的吗?那么循环就真的没有必要了。

https://book.mql4.com/ru/programm/special
 

有趣的是女孩们的舞蹈...站在一起齐声歌唱...

测试了又测试,根据结果增加/改变了功能/条件/数据,在盈利能力和缩减方面得到了或多或少的好结果......。不进行优化。重新加载了整个故事,它开始急剧下降,不--梅子,甚至不--大梅子......

如果在我重新加载报价历史(我在测试前有一个预先加载的欧元兑美元历史,我重新加载是为了以防万一--我在2010年由于某些原因在建模质量上出现了错误......)......。在重新加载历史记录之前,专家顾问成功地,好吧,几乎成功地经受住了不同的来回测试,成功地在三年的历史上进行了交易,但在重新加载报价后,开始出现每月两三次的缩水,并且在测试开始后的两三个月内没有工作 ...我没有改变任何条件,只有历史。

事实证明,在服务器上历史被改写了?就像苏联自古以来一样?

那么,这一切有什么意义呢?

 
artmedia70:

女孩们的舞蹈很有趣...一起站起来唱...

尝试和测试,添加/创建函数/条件/数据,在盈利能力和缩减方面得到了或多或少的好结果......。没有优化。重新加载了所有的历史,它开始下降,不--下降,甚至不--大下降......。

如果在重新加载报价历史(在测试之前,我已经预装了所有的欧元兑美元历史,为了安全起见,我重新加载了它,但由于某些原因,我在2010年以来的建模质量上出现了错误)...在重新加载历史记录之前,专家顾问成功地,好吧,几乎成功地经受住了不同的来回测试,成功地在三年的历史上进行了交易,但在重新加载报价后,开始出现每月两三次的缩水,并且在测试开始后的两三个月内没有工作 ...我没有改变任何条件,只有历史...

事实证明,在服务器上历史被重写了?就像苏联自古以来一样?

然后这一切的重点是什么?

如果你的MT仍然没有与服务器断开连接,那么是时候了(不要再不必要地连接它)--每次你启动测试器或优化,MT都会从服务器获得一个传播(等)。因此,当点差为1点时,一切都将是超级棒的,但如果在另一个时间,它增加到4-5点 - 专家顾问可能会开始赔钱。自然,最好是在最坏的条件下进行优化,因为它们在实际交易中更有可能发生。

 

这里有一点重做。

глобальные переменные (в самом начале, под #property link )
bool flagchange = false;
bool PrevFlag = false;
bool flag = false; 

int start()
  {
   //---вход в позицию
   //int    spread=MarketInfo("EURUSD",MODE_SPREAD);
   int Slippage = 3;
   int i = 0;
   double lt = getLots() ; // минимальный лот
   RefreshRates();
   int total = OrdersTotal();   
   int ticket = -1;
      flag = GetEma();
        if (PrevFlag != flag) // проверим, сигнал ема изменился?
         {flagchange = true;      // изменился!
         PrevFlag = flag;}
        else flagchange = false;
        if (flagchange == True)
         {       
           int Total=OrdersTotal(); // есть открытые позиции?
           if(Total>0)
            {
              for(i=Total-1; i>=0; i--) 
              {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) 
                  {
                    if(OrderType()==OP_BUY || OrderType()==OP_SELL) // Только Buy и Sell
                     {
                       if(OrderType()==OP_BUY) 
                         bool Result=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
                       else
                         Result=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
                     if(Result!=true) 
                        {          
                          Print("LastError = ",GetLastError()); 
                         }              
                      }
                   }
                else 
                   if (flag ==true) OrderSend(Symbol(),OP_BUY,lt,Ask,Slippage,Bid - sl * Point,0,"Buy",888,0,Blue);
                   else OrderSend(Symbol(),OP_SELL,lt,Bid,Slippage,Ask + sl * Point,0,"Seel",888,0,Red);
              }
           }                                            
        }
     
   return(0);
  }
      //////////////////////////////////////////////////////
  bool GetEma() {
  //----Получим значение EMA1
      int ma1= iMA(Symbol(),PERIOD_H1,ema1,0,1,6,0);
  //----Получим значение EMA2   
      int ma2= iMA("",PERIOD_H1,ema2,0,1,6,0); 
      if (ma1>ma2) return (True);
      else return (False);}
   /////////////////////////////////////////////////////  
         // посчитаем разтер лота
   double getLots() 
        {
                double minlot = MarketInfo(Symbol(), MODE_MINLOT);
                 int round = MathAbs(MathLog(minlot) / MathLog(10.0)) + 0.5;
                 double lot = minlot;
//---- select lot size
                 lot = NormalizeDouble(AccountFreeMargin() * Risk / 1000.0, round);
                 if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) 
                        {
                                lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), round);
                        }
                 if(lot < minlot) lot = minlot;
                 double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
                 if(lot > maxlot) lot = maxlot;
//---- return lot size
   return(lot);
        }

仍然没有交易 :(

 
chief2000:

如果你的MT仍然没有与服务器断开连接,现在是时候这样做了(不再不必要地连接它)--每次你运行测试器或优化时,MT都会从服务器接收一个传播(等等)。因此,当点差为1点时,一切都将是超级棒的,但如果在另一个时间,它增加到4-5点 - 专家顾问可能会开始赔钱。自然,最好是在最坏的条件下进行优化,因为它们在实际交易中更有可能发生。

这一切都很清楚,而且早已明白......但今天是星期六...今天的价差能改变吗?不...现在可能是最低的时候,也就是条件最好的时候......不...即使有任何价差,该EA的交易情况也很好...在历史重置之前。
 
artmedia70:
这一切都很清楚,而且早已明白......但今天是星期六...今天的价差能改变吗?不...现在可能是最小的,也就是说,最好的条件...不...即使有任何价差,该EA的交易情况也很好...在历史重置之前。
那么,如果你看一下图表上的交易 进展,有什么变化呢?
 
Techno:
那么,如果你看一下图表上的交易进度,有什么变化呢?
股票缩水已经增加了许多倍...事实证明,开仓 有更多的条件。他实际上打开了更多的位置...
 
MarkTrade:

这里有一点重做。

仍然没有交易 :(

在条件/逻辑
,某处肯定有错误,因为MetaEditor没有调试器,所以我这样做。

在代码的末尾加上

Comment( "flag=", flag, " PrevFlag=", PrevFlag, ......);

return(0);

}

在测试器的可视化模式下,以低速查看哪些变化,哪些没有变化。

 
artmedia70:
股票缩水比以往增加了许多倍...事实证明,开仓的条件已经增加。他实际上打开了更多的位置...
我不是说测试图,而是报价图,大致上,开盘、收盘的变化是什么?