MQL4 OrderCloseBy() возвращает ошибку 3 == [ ERR_INVALID_TRADE_PARAMETERS ]

Я нашел эту ошибку, и я не уверен в причине (синтаксис похож на C)

Функция должна закрыть ордер на покупку с ордером на продажу, но я получаю
error 3: invalid trade parameters.

Я неправильно устанавливаю какой-то параметр?

Я уже вызывал OrderClose() успешно, поэтому я предполагаю, что OrderSend() верен.

void closeBuySell(int buyTicket){
   double buyPrice = OrderClosePrice();
   //Print("total ",OrdersTotal()," ",buyTickets," ",sellTickets);
   for(int Counter=0; Counter<OrdersTotal(); Counter++){ //search for a matching sell
      if(OrderSelect(Counter,SELECT_BY_POS) && OrderType()==OP_SELL && OrderOpenPrice()>buyPrice){
         Print("CLOSING BUYSELL ",buyTicket," ",OrderTicket()," ",OrderOpenPrice(),">",buyAsk);
         if(OrderCloseBy(buyTicket,OrderTicket(),Red)){ buyTickets--; sellTickets--; }
         else Print(ErrorDescription(GetLastError()));
         break;
      }
   }
}

int buyTickets=0;
int sellTickets=0;
bool up = false;
void OnTick(){
   double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0);
   double SlowMA = iMA(NULL,0,SlowMAPeriod,0,0,0,0);
   if(FastMA>SlowMA && !up){ up=true;
       if(buyTickets<15 && OrderSend(Symbol(),OP_BUY,.1,Ask,40,0,0))
           buyTickets++;
   }
   if(FastMA<SlowMA && up){ up=false;
       if(sellTickets<15 && OrderSend(Symbol(),OP_SELL,.1,Bid,40,0,0))
           sellTickets++;
   }

   for(int Counter=0; Counter<OrdersTotal(); Counter++) //ordercloseby buy with sell
      if(OrderSelect(Counter,SELECT_BY_POS) && OrderType()==OP_BUY)
          closeBuySell(OrderTicket());
}

Выход:

...after
13:42  practice1 EURUSD,M5: invalid trade parameters
13:42  practice1 EURUSD,M5: OrderCloseBy error 3
13:42  practice1 EURUSD,M5: CLOSING BUYSELL 17 8 1.086>1.086
13:40  practice1 EURUSD,M5: invalid trade parameters
13:40  practice1 EURUSD,M5: OrderCloseBy error 3
13:40  practice1 EURUSD,M5: CLOSING BUYSELL 23 1 1.0858>1.0855
13:40  practice1 EURUSD,M5: invalid trade parameters
13:40  practice1 EURUSD,M5: OrderCloseBy error 3
13:40  practice1 EURUSD,M5: CLOSING BUYSELL 22 1 1.0858>1.0855
00:05  practice1 EURUSD,M5: sell orders:12
00:05  practice1 EURUSD,M5: open #12 sell limit 0.10 EURUSD at 1.08598 ok
00:05  practice1 EURUSD,M5: sell orders:11
00:05  practice1 EURUSD,M5: open #11 sell limit 0.10 EURUSD at 1.08599 ok
00:05  practice1 EURUSD,M5: sell orders:10
00:05  practice1 EURUSD,M5: open #10 sell limit 0.10 EURUSD at 1.08600 ok
...before

person shuji    schedule 05.06.2016    source источник


Ответы (1)


Да, некоторые детали нужно изменить:

Справедливое замечание, будьте осторожны, MQL4 — это не C язык — короче — string не на самом деле string, а < strong>struct, режимы компиляции молча изменяют приоритет операторов в алгебраических выражениях (!!) (если не "механически" принудительно с помощью круглых скобок) неоднозначно контролируются почти невидимой директивой #property strict, и применяются аналогичные опасные различия.

Незначительная проблема, так называемые Рыночные ордера не должны иметь настройки параметра Срок действия, они немедленно исполняются «На рынке», поэтому истечение TimeDOMAIN-горизонт для них не имеет смысла.

Похоже, вы забыли обязательный шаг перед доступом к функциям db.POOL — вызов OrderSelect():

int buyTickets  = 0;
int sellTickets = 0;
int mn          = 0;

void OnTick(){

     double FastMA = iMA( NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0 );
     double SlowMA = iMA( NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0 );

     if (  FastMA >  SlowMA &&  buyTickets <  15 ){  buy( .1 ); Print(  "buy orders:",  buyTickets ); }
     if (  FastMA <  SlowMA && sellTickets <  15 ){ sell( .1 ); Print( "sell orders:", sellTickets ); }

     for ( int Counter = 0; Counter <  OrdersTotal(); Counter++ )
     {   OrderSelect( Counter, SELECT_BY_POS );   // *MUST* .SELECT() 1st
         if (  OrderType()      == OP_BUY         //         to access Order*() funcs
            && OrderCloseTime() == 0              // *!CLOSED* only
            && FastMA           <  SlowMA         // aPriceDOMAIN condition holds
            )  closeBuySell( OrderTicket() );     // closeBuySell()
     }
}

void buy( const double LotSize ){
     int    Slippage       = GetSlippage( Symbol(), 4 ); // ~ 40
     double StopLoss       = 0;
     double TakeProfit     = 0;
     int    MagicNumber    = mn++;
     int    ExpirationDate = TimeCurrent() + PERIOD_M1 * 60 * 24;
     int    buyTicket      = OrderSend( Symbol(),
                                        OP_BUY,
                                        LotSize,
                                        Ask,
                                        Slippage,
                                        StopLoss,
                                        TakeProfit,
                                        "Buy Order",
                                        MagicNumber,
                                        ExpirationDate, // --------------
                                        Green
                                        );
     if (  buyTicket == -1 ) Print( "OrderSend Error:", ErrorDescription( GetLastError() ) );
     else  buyTickets++;
}

void sell( const double LotSize ){
     int    Slippage       = GetSlippage( Symbol(), 4 );
     double StopLoss       = 0;
     double TakeProfit     = 0;
     int    MagicNumber    = mn++;
     int    ExpirationDate = TimeCurrent() + PERIOD_M1 * 60 * 24;
     int    sellTicket     = OrderSend( Symbol(),
                                        OP_SELL,
                                        LotSize,
                                        Bid,
                                        Slippage,
                                        StopLoss,
                                        TakeProfit,
                                        "Sell Order",
                                        MagicNumber,
                                        ExpirationDate, // --------------
                                        Green
                                        );
     if (  sellTicket == -1 ) Print( "OrderSend Error:", ErrorDescription( GetLastError() ) );
     else  sellTickets++;
}

void closeBuySell( const int buyTicket ){
     OrderSelect( buyTicket, SELECT_BY_TICKET );
     double buyAsk = OrderClosePrice();
  // Print( "total ", OrdersTotal(), " ", buyTickets, " ", sellTickets );
     for ( int Counter = 0; Counter < OrdersTotal(); Counter++ ){ // search for a matching sell
           OrderSelect( Counter, SELECT_BY_POS );
           if (  OrderType()      == OP_SELL
              && OrderCloseTime() == 0            // *!CLOSED" only
              && OrderOpenPrice() >  buyAsk
              ){
              Print( "CLOSING BUYSELL ", buyTicket, " ", OrderTicket(), " ", OrderOpenPrice(), ">", buyAsk );
              if (  OrderCloseBy( buyTicket, OrderTicket(), Red ) ){
                     buyTickets--;
                    sellTickets--;
              }
              else  Print( ErrorDescription( GetLastError() ) );
              break;
           }
     }
}
person user3666197    schedule 05.06.2016