初学者的问题 MQL5 MT5 MetaTrader 5 - 页 360

 

下午好。

能否请您告诉我在MT4交易EA时如何正确写代码,我对编程非常陌生。

我必须选择最后关闭的订单并比较其利润。 如果其利润大于0,我就不做任何事情,如果小于0,我就必须做一些事情。

double GetSizeLot(double lastlot=0) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if(!DynamicLot)Lot2=Lots;
   if(lastlot<Lot2)lastlot=Lot2;
   
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
     if(OrderProfit()<0) lastlot=lastlot*Martin;
     if(OrderProfit()>0) lastlot=Lot2;
     }
   Lot2=lastlot;
   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   return(NormalizeDouble(Lot2,2));
  }

我非常尊重你,亚历山大。

 
Menshikov:

下午好。

能否请您告诉我在MT4交易EA时如何正确写代码,我对编程非常陌生。

我必须选择最后关闭的订单并比较其利润。 如果其利润大于0,我就不做任何事情,如果小于0,我就必须做一些事情。

我非常尊重你,亚历山大。

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

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();  // запомним профит
               his_lt=OrderLots();    // запомним лот
              }

if(profit<0) //если профит меньше нуля
   lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak:
非常感谢你。
 
Vladimir Pastushak:
我不知道这个时间是干什么用的,为什么要记住关门时间,反正你选择的是列表中的最后一个,那这个周期呢?而你为什么不考虑交换和佣金呢?即使OrderProfit()>0,实际利润也可能是负数。如果你直接处理订单列表,那么你就不应该留下寻找最后一个订单的循环代码的碎片。一件事是要么可靠和确定,要么就是速度。而你有一个杂乱无章的东西。
 
Artyom Trishkin:
我不知道这个时间是干什么用的,为什么要记住关门时间,反正你选择的是列表中的最后一个,那这个周期呢?而你为什么不考虑交换和佣金呢?即使OrderProfit()>0,实际利润也可能是负数。如果你直接处理订单列表,你不应该从循环中留下大块的代码,在关闭的时候寻找最后一个订单。一件事是要么可靠和确定,要么就是速度。你所拥有的是一个杂乱无章的东西。

你所建议的是

   if(OrderSelect(OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

你会这样做吗?

这个人只要求一个利润订单,为什么要强加你没有要求的东西?但我同意你的观点 ....

 

请告知如何在MT4的MQL4中,在20个柱子后关闭未平仓的订单,即当订单被打开并出现20个新柱子时,它就会被关闭。(只有1个订单始终开放)。由于某些原因,这段代码在策略测试器中 不起作用,而我们需要它这样做。


该代码有如下含义:我们检查是否有任何未平仓的订单,如果没有,我们打开一个订单,并在 "z "变量中记录第1条的未平仓价格,然后随着每一个刻度,我们检查第20条的未平仓价格,当第1条最终到达第20条时,其价格将与 "z "变量中记录的价格相同,然后该订单将被关闭。(当然,在这个过程中,价格可以重合,但这将是非常罕见的,此外,我们可以将第1条的更多参数写入变量中)


double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер
              {
               OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+150*Point, Bid-10*Point);
                   z = Open[1]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
            else

           Print("ORDER NE USTANOVLEN!!!");




           //ЗАКРЫТИЕ ОРДЕРА

    if (z==Open[20])  //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

            //-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
      else
      Print("ORDER NE ZAKRYT!!!");
 
BEGEMOT32:

请告知如何在MT4的MQL4中,在20个柱子后关闭未平仓的订单,即当订单被打开并出现20个新柱子时,它就会被关闭。(只有1个订单始终开放)。由于某些原因,这段代码在策略测试器中 不起作用,而我们需要它这样做。


该代码有如下含义:我们检查是否有任何未平仓的订单,如果没有,我们打开一个订单,并在 "z "变量中记录第1条的未平仓价格,然后随着每一个刻度,我们检查第20条的未平仓价格,当第1条最终到达第20条时,其价格将与 "z "变量中记录的价格相同,然后该订单将被关闭。(当然在这个过程中,价格可以重合,但这将是非常罕见的,此外,我们可以将第1条的更多参数写入变量中)


就是这样,我自己想明白了,我应该在int start()之外声明这个变量--现在工作正常了。
 
BEGEMOT32:
就是这样,我自己想明白了,我应该在int start()之外声明一个变量--现在工作正常了。

我对你的代码进行了一些简化,但你的代码中仍然存在错误

//ОТКРЫТИЕ ОРДЕРА
if(OrdersTotal()==0) // если нет открытых ордеров то открывать ордер
   if(OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+150*Point,Bid-10*Point)<0)
      Print("ORDER NE USTANOVLEN!!!");

//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;
   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==20)
           {
            if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if(result!=TRUE)
           {
            error=GetLastError();
            Print("LastError = ",error," ",Symbol());
           }
         else error=0;
        }
      else Print("Error when order select ",GetLastError());

     }
 

我正在编写一个多币种的EA,但我不明白为什么如果我把它与不同的货币联系起来,它在同一时间返回不同的价格

简而言之,代码。

在启动时

EventSetTimer(60);

在OnTimer()中

MqlTick last_tick;
if(SymbolInfoTick("EURNZD",last_tick))
{
    Print("Last Ask: ", last_tick.ask);
}

如果我在EURNZD上测试我的EA,比如说

2015.05.18 00:07:00Lat Ask: 1.5370

如果我使用任何其他货币对

2015.05.18 00:07:00Lat Ask: 1.5323

这个值是完全不同的,在第二种情况下,根据图表,至少在几个小时内不可能有这样一个值

在策略测试器中,所有的点都处于交易模式,我感觉如果不是主要的货币对,策略测试器中的数值是近似的。

我忘了补充,这是Meta Trade 5

我发现,第一次做的时候,价格是错误的,第二次做的时候,价格是正常的。

 
1.你能从历史上找出多少个刻度的刻度量,并在刻度量 上有所上升和下降吗?

2.我删除autochartis已经有几个月了,但日志信息一直冒出来。该软件一直试图打开文件。

如何彻底清除autochartis?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]