Вопросы от начинающих 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.

Так рад видеть пропавшую Оксану ))

Да, тикеты начинаются с 1 в тестере и на серваке ДЦ, но в ДЦ вы 1 никогда не словите. Ваш вариант не совсем рабочий, не корректно сравнивать на неравенство с -1. А если реальный счет вернет 1234567?

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


// так верно
 

Так в тестере тикет меньше одного быть не может, на реале тем более 

ноль это меньше единицы, оба условия правильные, только одно на сравнение, другое на исключение. 

хотя у себя привык делать так:

// Открываем ордер
      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:
Доброго вечера .Всех с наступающим Новым годом ..Подскажите пожалуйста ,что в это куске кода не так ?При закрытии села закрывается и бай .А вот при закрытии бая селл остается ..нужно чтобы при закрытии села бай не закрывался и работал дальше 

Советую поменять логику на корню

То есть необходимо вести учет открытых ордеров - сколько открыто селлов, сколько открыто баек

А уже потом исходя из этих соображений управлять ордерами - открывать и закрывать

 

Всем с наступающим!

прошу помощи, не понимаю почему советник открывает много ордеров, если в условии для открытия не должно быть отложек, а он после открытия опять открывает. подозреваю с циклом не так чтото? не очень понимаю циклы

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++; // Считаем отложенные селлстопы

       }


// Теперь открываем ордера

    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:

Всем с наступающим!

прошу помощи, не понимаю почему советник открывает много ордеров, если в условии для открытия не должно быть отложек, а он после открытия опять открывает. подозреваю с циклом не так чтото? не очень понимаю циклы

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++; // Считаем отложенные селлстопы

       }


// Теперь открываем ордера

    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Количество открытых и отложенных ордеров достигло предела, установленного брокером.
Выкладывайте весь код, по кускам трудно понять где вы допускаете ошибки
 

Прриветствую. Всех с НГ!

Бывает при попытке оптимизации какого-либо советника после выполнения результаты и график оптимизации пустые а в журнале запись:

There were 2 passes done during optimization, 2 results have been discarded as insignificant  (Были 2 проходит сделано в процессе оптимизации, 2 результаты были отброшены как незначительное) (2 - к примеру)

убрать галку "генетический алгоритм" при этом не помогает. Я понимаю что тестеру таки результаты кажутся незначительными, но как увидеть то что есть? И это при том что советник за период, при тестировании, за тот-же период (год) не сливает а гоняет +/- 20%. 

Причина обращения: