Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай принцип работы Торговых Сигналов для MetaTrader
Evgeniy Zhdan
4618
Evgeniy Zhdan 2014.02.07 14:38 

Здравствуйте, уважаемые форумчане! Столкнулся с досадной проблемой - советник упорно не выбирает свои ордера. В частности, нужно, чтобы открытый ордер закрывался по противоположному сигналу и открывался по новому сигналу. В тестере все идеально. А вот на демо он ордера открывает, но не закрывает их по противоположному сигналу. Думается, что какая-то байда с тикетом, уже по разному пробовал но не хочет работать! Помогите пожалуйста! Вот код:

#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//|                                                  MA_CROSS EA.mq4 |
//|              Copyright 2014, drivermql@mail.ru  skype: drivermql |
//|                                              http://drivermql.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, drivermql@mail.ru  skype: drivermql"
#property link      "http://drivermql.ru"

extern string    name           = "cross"; // это будет в комментарии к открытым ордерам
extern int       TakeProfit     = 5;
extern string    okm            ="Манименеджмент";
extern bool      MM             = true;
extern int       MaxRisk        = 1; // процент от депозита 
extern string    tre            ="Если ММ выключен";
extern double    Lot            = 0.01;
extern string    Setting        = "Настройки MA Cross_OC";
extern int       FasterMode     = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int       FasterMA       = 5;
extern int       SlowerMode     = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int       SlowerMA       = 5;
extern string    tech           = "Cлужебные настройки";
extern int       Magic          = 794613;
extern int       Slippage       = 2;
extern int       Retry          = 10; //количество попыток открытия ордера


double ma_blue, ma_red,sl,tp;
int ticket;

int init()
  {
   if (Digits == 5 || Digits == 3 )
   {
   TakeProfit*=10;
   Slippage*=10;
   }
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  ma_blue = iCustom(Symbol(),0,"MA_Cross_OC",FasterMode,FasterMA,SlowerMode,SlowerMA,0,1);
  ma_red  = iCustom(Symbol(),0,"MA_Cross_OC",FasterMode,FasterMA,SlowerMode,SlowerMA,1,1);

  if (MM == true) // 
   {
   double Free    = AccountFreeMargin();
   double One_Lot = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double Step    = MarketInfo(Symbol(),MODE_LOTSTEP);
   double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);  
   double Lots     = MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
   if(Lots<Min_Lot) Lots=Min_Lot;
   if(Lots>Max_Lot) Lots=Max_Lot;
    }
   if (MM==false) Lots = Lot;
   
   CloseSell ();
   CloseBuy ();

  
  if (CountSell() == 0 &&  CountBuy() == 0 && ma_red >0 && ma_red < 10000) //  CountBuy () == 0   &&
   {
     ticket = OrderSendX(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,name,Magic,0,Red);
     
     if (ticket>0)
     {
       if (OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) // выбираем ордер для модицикации
        {
        double  openprice = OrderOpenPrice();
        tp = NormalizeDouble(openprice - TakeProfit *Point,Digits); // то же с тейком
           OrderModifyX (ticket,OrderOpenPrice(),0,tp,0); // модифицируем СЛ и ТП для ЕСН счетов
           }
         }
       }    
 
    if ( CountBuy() ==0  && CountSell () == 0&& ma_blue > 0 && ma_blue < 10000 ) // == 0
    {
     ticket = OrderSendX (Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,name,Magic,0,Green);
     if (ticket>0)
     {
       if (OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) // выбираем ордер для модицикации
       {
         openprice = OrderOpenPrice();
         tp = NormalizeDouble(openprice + TakeProfit *Point,Digits); // то же с тейком
         OrderModifyX (ticket,OrderOpenPrice(),0,tp,0); // модифицируем СЛ и ТП для ЕСН счетов
          }              
        }
      }         
   return(0);
}
int CountBuy ()
{
   int count = 0;
   for (int trade = OrdersTotal ()-1;trade>=0; trade--)
   {
     OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
     if (OrderSymbol ()==Symbol () && OrderMagicNumber ()==Magic)
      {
        if (OrderType ()==OP_BUY)
        count++;
      }
    }
     return (count);
} 

int CountSell ()
{
   int count = 0;
   for (int trade = OrdersTotal ()-1;trade>=0; trade--)
   {
     OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
     if (OrderSymbol ()==Symbol () && OrderMagicNumber ()==Magic)
      {
        if (OrderType ()==OP_SELL)
        count++;
      }
    }
    return (count);
 } 
//           ЗАКРЫТИЕ ОРДЕРОВ     =================
  void CloseBuy ()
   {
      
      if (CountBuy () > 0   && ma_red > 0 && ma_red < 10000 )
       {
        if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY && OrderCloseTime()==0)
         {
           OrderClose (ticket,OrderLots(),Ask,10000,Yellow);
           
            }
          }
        }
}
   void CloseSell ()
   {
      
     if ( CountSell () > 0 && ma_blue > 0 && ma_blue < 10000 ) 
      
      {
       if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
       {
        if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&& OrderType()==OP_SELL && OrderCloseTime()==0)
         {
         
          OrderClose (ticket,OrderLots(),Bid,10000,Yellow);
         }
            }
          }
        }  
//==========================================


bool OrderModifyX(int ticket,double price,double stoploss,double takeprofit,
                  datetime expiration,color arrow_color=CLR_NONE)

  {
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      price=NormalizeDouble(price,Digits);
      stoploss=NormalizeDouble(stoploss,Digits);
      takeprofit=NormalizeDouble(takeprofit,Digits);
      CheckValidStop(Symbol(),price,stoploss);

      bool  result;
      int err=GetLastError();
      err=0;

      // int Retry = 10;
      int cnt=0;
      bool exit_loop=false;

      while(!exit_loop)
        {
         
         result=OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color);
         err=GetLastError();

         if(result==true)
           {
            Print("Ордер #"+ticket+" успешно модифицирован");

            //exit_loop = true;
            return(true);
           }
         switch(err)
           {

            case ERR_NO_ERROR: exit_loop=true;break;
            case ERR_SERVER_BUSY:
            case ERR_NO_CONNECTION:
            case ERR_INVALID_PRICE:
            case ERR_OFF_QUOTES:
            case ERR_BROKER_BUSY:
            case ERR_TRADE_CONTEXT_BUSY:
               cnt++;
               break;
            case ERR_INVALID_PRICE:
            case ERR_PRICE_CHANGED:
            case ERR_OFF_QUOTES:
            case ERR_REQUOTE:
               RefreshRates();
               continue;
            default: exit_loop=true; break;
           }
        }

      if(err!=ERR_NO_ERROR)
        {
         Print("Ошибка модификации ордера #"+ticket);
         Print("Код ошибки: "+err);

        }

     }
   else
     {
      Print("Не удалось выбрать ордер, ticket = "+ticket);
      return(false);

     }

  }

void  CheckValidStop(string symbol,double price,double &sl)

  {
   if(sl==0)
      return;
   double servers_min_stop=MarketInfo(symbol,MODE_STOPLEVEL)*MarketInfo(symbol,MODE_POINT);

   if(MathAbs(price-sl)<=servers_min_stop)
     {

      if(price>sl)
         sl=price-servers_min_stop;
      else sl=sl+servers_min_stop;

     }

   sl=NormalizeDouble(sl,MarketInfo(symbol,MODE_DIGITS));

  }

int OrderSendX(string symbol,int cmd,double volume,
               double price,int slippage,double stoploss,
               double takeprofit,string comment,int magic=0,
               datetime expiration=0,color arrow_color=CLR_NONE)

  {
   int err=GetLastError();
   err=0;
   bool exit_loop=false;
   int ticket=-1;

// int Retry = 10;
   int cnt=0;

   if(cmd==OP_SELL || cmd==OP_BUY)
     {
      while(!exit_loop)
        {
         ticket=OrderSend(symbol,cmd,volume,price,slippage,stoploss,
                          takeprofit,comment,magic,expiration,arrow_color);
         err=GetLastError();

         switch(err)
           {

            case ERR_NO_ERROR: exit_loop=true;break;
            case ERR_SERVER_BUSY:
            case ERR_NO_CONNECTION:
            case ERR_INVALID_PRICE:
            case ERR_OFF_QUOTES:
            case ERR_BROKER_BUSY:
            case ERR_TRADE_CONTEXT_BUSY:
               cnt++;
               break;
            case ERR_INVALID_PRICE:
            case ERR_PRICE_CHANGED:
            case ERR_OFF_QUOTES:
            case ERR_REQUOTE:
               RefreshRates();
               continue;
            default: exit_loop=true; break;
           }
         if(cnt>Retry)
            exit_loop=true;

         if(!exit_loop)
           {
            Sleep(1000);
            RefreshRates();

           }
         else
           {
            if(err!=ERR_NO_ERROR)
              {
               Print("Ошибка: "+err);
              }

           }
         if(err==ERR_NO_ERROR)
           {
            OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
            return(ticket);
           }
         Print("Ошибка открытия ордера после "+cnt+" попыток");
         return(-1);
        }
     }
  }  

В советнике коммент // ЗАКРЫТИЕ ОРДЕРОВ ================= вот там функция выбора ордера и закрытия

Может ли меняться тикет ордера при его модификации??

Alexander
2441
Alexander 2014.02.07 15:01  
Длинные позиции закрываются по Биду, короткие - по Аску.
Evgeniy Zhdan
4618
Evgeniy Zhdan 2014.02.07 15:10  
Roger:
Длинные позиции закрываются по Биду, короткие - по Аску.

Спасибо, действительно))))
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий