Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1100

 

Уважаемые программисты, помогите пожалуйста ,  установить запрет на открытие более одной серии сделок одновременно ( серия это если ордер закрывается в убытке или в нолях и тогда открывается следующая сделка по этому же инструменту, но с увеличенным лотом), то есть если открывается одна серия сделок вторая и последующая ставиться по другим инструментам под  запрет ( бот одновременно работает на разных инструментах). Думаю, это нужно делать через глобальную переменную терминала, но у меня не хватает знаний и опыта я только недавно начал изучать  MQL. Это советник по бинарным опционам. Вот код 

extern double       Lots             = 1;      // Лот

extern int          Exp              = 1;      // Експирация

extern int          Wait             = 1;      // Количество свечей одного направления

extern int          Timeout          = 1;      // Промежуток времени

extern double       Multiplier       = 3;      // Множитель

extern int          Slippage         = 5;      // Проскальзывание

extern int          Magic            = 2090; // Магик


int ticket, Type;

double Price, Lot;

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

//| Expert initialization function                                   |

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

int OnInit()

{

   

   return(INIT_SUCCEEDED);

}

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

{

   

}

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

//| Expert tick function                                             |

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

void OnTick()

{

   // --------------- Открытие сделок ---------------

   if (OrdersTotal() == 0) // Количество ордеров должно равняться нулю     

   {

      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) 

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) 

      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY)) 

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))) 

      || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy() && OrdersTotal() == 0) 

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell() && OrdersTotal() == 0)

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

            

            Comment ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY),  "PriceCloseLastHistOrder(OP_SELL)=", 

             PriceCloseLastHistOrder(OP_SELL) );

         }

      }

   }

}

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

int CountTrades(int type = -1) // Определение количества сделок

{

   int cnt = 0;

   for (int i=OrdersTotal()-1; i>=0; i--) // В цикле идет перебор абсолютно всех открытых ордеров, i -- порядковый номер ордера

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Функция проверяет есть ли в рынке ордер с порядковым ордером i, 

      // если есть то проверяются следующие условия...

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Если символ, 

         // на котором открыт ордер, равняется текущему символу и Магик ордера равняется магику в настройках текущего советника и 

         // тип ордера равняется равняется значению type (или type == -1 (в случае, если без разницы какой тип нужен для подсчета ордеров))

            cnt++; // К переменной cnt добавляется 1, и в конце цикла cnt уже будет равнятся количеству сделок, 

            // открытых текущим советнкиом по текущей валютной паре с определенным типом

      }

   }

   return(cnt); // Возвращается значение переменной cnt

}

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

int CountHistTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

bool SignalBuy()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] > Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

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

bool SignalSell()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] < Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

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

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;


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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   

   return(opentime);

}

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

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

   

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   

   return(type);

}

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

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

   

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   

   return(lots);

}

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

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   

   return(price);

}

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

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   

   return(price);

}

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

 
Здравствуйте, коллеги!

У меня при программировании появился вопрос: а можно ли как-то получить в Советнике время сервера с точностью до миллисекунд?
Например, получаем: 23.09.2016 14час. : 53мин. : 54000 миллисекунд? То есть ровно в 54 секунды, 000 м/сек.
 
e-partner:
Здравствуйте, коллеги!

У меня при программировании появился вопрос: а можно ли как-то получить в Советнике время сервера с точностью до миллисекунд?
Например, получаем: 23.09.2016 14час. : 53мин. : 54000 миллисекунд? То есть ровно в 54 секунды, 000 м/сек.

Интересный вопрос. Что Вы имеете в виду, уточнить последнее известное время сервера, время прихода последней котировки TimeCurrent() или текущее время на сервере?

Если TimeCurrent(), то какой от этого прок, если учесть, что пакет с новой котировкой идет по сети Интернет от сервера к терминалу 10-500 мс, и время это от пакета к пакету меняется. К тому же нет определенности, что такое приход последней котировки, если они идут на сервер из нескольких источников, провайдеров ликвидности, после чего идет обработка, затем рассылка сервером нового тика. Кроме того, неизвестно, как системный таймер сервера синхронизирован с астрономическим временем. 09.01.2014 с 04:15 по 06:15 МСК (четверг, торговый день) я это выяснял, как отклонение не от астрономического, а от среднего для 31 компании. На рисунке для 25 моментов времени показаны эти отклонения (в секундах, не в мс):

И какой смысл выяснять что-либо в миллисекундах по данным от сервера?

Второй вариант понятнее. Если на Вашем компьютере синхронизация времени с астрономическим осуществляется c известной Вам погрешностью, с такой же погрешностью известно астрономическое время (с учетом разности поясов) в населенном пункте, где работает сервер. Только зачем оно...

 

Куда - то из тестера стратегий делась оптимизация. Галки все стоят ничего понять не могу. МТ4 билд 1010. Виндовс 8.1.

Подскажите как активировать оптимизацию.

Скрины прилагаю. Пропала кнопка оптимизировать.

Файлы:
desktop.zip  129 kb
 
Почему у меня MT4 b1010 не позволяет отладку на исторических данных (не активна кнопка и пункт меню)? В MT5 все ок.
 
Патамушта разработчики запретили.
 
int Magik;
int Slippage = 5,stopL1 = 50,takeP1 = 20;
int trend,TicketS,TicketB;
double rsi,TP,SL;
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
if(Digits == 3 || Digits == 5)
   {
     Slippage *= 10;
     stopL1   *= 10;
     takeP1   *= 10;
   }
   

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
 double priseBuy = FindLastOrderPrise (OP_BUY);
 double priseSel = FindLastOrderPrise (OP_SELL);
double frezeelevl = MarketInfo(OrderSymbol(),MODE_FREEZELEVEL); 
  rsi = iRSI(Symbol(),PERIOD_D1,7,PRICE_CLOSE,0);
  trend = WhatTrend();
if (CountTrades() == 0)
 {
   if(trend == 1 && rsi <=30)
   {
     if(OrderSend(Symbol(),OP_BUYLIMIT,0.10,Ask,Slippage,0,0,"первый ордер бай установлен",Magik,0)== true)
      { 
          TicketB = FindLastTicket(OP_BUY);
          if(TicketB >0)
          {
             SL = priseBuy + NormalizeDouble(takeP1 * Point,Digits);
             TP = priseBuy - NormalizeDouble(stopL1 * Point,Digits);
             if(OrderModify(TicketB,priseBuy,SL,TP,0)== true)
             Comment("урааааааа");
            
          }

        
      }
     
   }//   if(trend == 1 && rsi <=30)
   else if(trend == 2 && rsi >= 70)
   {
     if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0)== true)
      {
        for(int i = OrdersTotal()-1;i >0;i--)
         {
           OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES);
            if (OrderType()== OP_SELL && OrderMagicNumber() == Magik)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==true)break;
                else continue;
             }
         }
      }
   }    
 }//if (CountTrades() == 0)

 
   

}

прошу компетентных програмистов обьяснить в чем моя ошибка?? почему ордер не модифицируется!!!и компилятор не выдает ошибок при этом 

 

 
Я изучил учебник.прочитал и законспектировал..Вы могли бы конкретно указать на ошибки.. потому что компилятор ошибок не выдает и в тестере ошибок нет.но ордер не модифицируется.как будто ордер модифи вовсе не видно в программе
 
burbur87:
Я изучил учебник.прочитал и законспектировал..Вы могли бы конкретно указать на ошибки.. потому что компилятор ошибок не выдает и в тестере ошибок нет.но ордер не модифицируется.как будто ордер модифи вовсе не видно в программе

Читайте внимательно что возвращает OrderSend()

 if(OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0) > 0)

 

Да и вообще я бы сделал так:

   int ticket=OrderSend (Symbol(),OP_SELLLIMIT,0.10,Bid,Slippage,0,0,"первый ордер сел установлен",Magik,0);
   if(ticket>=0)
      {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
          {
            if (OrderStopLoss()==0 || OrderTakeProfit()==0)
             {
               double sl = OrderOpenPrice() + NormalizeDouble(stopL1 * Point,Digits);
               double tp = OrderOpenPrice() - NormalizeDouble(takeP1 * Point,Digits);
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)) Print("Error ",GetLastError()," modify order ",ticket);
             }
          }
      }
 
Sepulca:

Читайте внимательно что возвращает OrderSend()

if(ticket>=0)

Да и вообще я бы сделал так:

Разве тикет может быть равен нулю?
Причина обращения: