初学者的问题 MQL4 MT4 MetaTrader 4 - 页 46

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

更准确的说法是。

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend-"返回交易服务器分配给订单的票号,如果失败则返回-1 "

虽然即使在测试器中,第一张票的号码也是1,而不是0。

 
Oksana Berenko:

更准确地说,它将是。

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend -"返回交易服务器分配给订单的票号,如果失败则返回-1 "

虽然即使在测试器中,第一张票的号码也是1,而不是0。

很高兴看到失踪的奥克萨娜))。

是的,在测试器和DC服务器上的票据以1开始,但你永远不会在DC中抓到1。你的版本不大管用,用-1来比较不等式是不正确的。如果真实账户 返回1234567怎么办?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

因此,在测试器中,一张票不能小于1,在现实世界中更是如此。

0小于1,两个条件都是正确的,只有一个用于比较,另一个用于排除。

虽然我已经习惯了这样做。

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

但考虑到我的,条件都是正确的,只是逻辑不同)

 
晚上好,请允许我祝您新年快乐!请您告诉我这段代码有什么问题吗?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
我祝你新年快乐!你能告诉我这个代码有什么问题吗?

我建议从根源上改变逻辑

即有必要保留未结订单的记录--有多少卖出,有多少拜克被打开

然后基于这些考虑,我们应该管理订单 - 打开和关闭它们

 

我不知道为什么EA开了很多订单,如果条件不应该是开仓,但开仓后又开了。

我不明白为什么我的EA开了很多订单,如果我不想让它开仓,但在我开仓后又开了,我怀疑是循环出了问题,我不太明白循环的问题

for(int i=OrdersTotal()-1;i>=0;i--)

如果(OrderSelect(i,SELECT_BY_POS))

如果(OrderMagicNumber()==magic) //如果我们的Magic

{

if(OrderType()==OP_BUY) sdel_b++; // count bai

如果(OrderType()==OP_SELL) sdel_s++; // 计算sels

如果(OrderType()==OP_BUYSTOP) otl_b++; // 计算待定的补仓次数

if(OrderType()==OP_SELLSTOP) otl_s++; // 计算待定卖出止损点

}


// 现在开放订单

if(Hour()==00 &&Minute()==01 && otl_b==0 && otl_s ==0); // 如果是时间,并且没有挂单。

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //取一个位置。

OrderSend (Symbol(,OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

我不知道为什么EA开了很多订单,如果条件不应该是开仓,但开仓后又开了。

我不明白为什么我的EA开了很多订单,如果我不想让它开仓,但在我开仓后又开了,我怀疑是循环出了问题,我不太明白循环的问题

for(int i=OrdersTotal()-1;i>=0;i--)

如果(OrderSelect(i,SELECT_BY_POS))

如果(OrderMagicNumber()==magic) //如果我们的Magic

{

if(OrderType()==OP_BUY) sdel_b++; // count bai

如果(OrderType()==OP_SELL) sdel_s++; // 计算sels

如果(OrderType()==OP_BUYSTOP) otl_b++; // 计算待定的补仓次数

if(OrderType()==OP_SELLSTOP) otl_s++; // 计算待定卖出止损点

}


// 现在开放订单

if(Hour()==00 &&Minute()==01 && otl_b==0 && otl_s ==0); // 如果是时间,并且没有挂单。

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //取一个位置。

OrderSend (Symbol(,OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

试试这个

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

试试这个

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
依然开出大量订单
148未结订单挂单 的数量已经达到经纪人设定的限制。
 
wishmast:
仍旧打开了大量的订单
148未结订单挂单 的数量已经达到经纪人设定的限制。
请把整个代码发给我们,我很难理解你在哪里犯了错误
 

问候。祝大家新年快乐!

当我试图在EA运行后对其进行优化时,结果和优化图都是空白的,并且在日志中写有日志。

在优化过程中做了2,有2个结果因不 重要而被丢弃。

取消对"遗传算法"的勾选并没有帮助。我理解,对测试者来说,结果似乎微不足道,但我们如何才能看到那里有什么?而这是在测试过程中,尽管专家顾问在同一时期(一年)没有亏损,但也是+/-20%。