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

 
Artyom Trishkin:
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
спасибо, модер)
 
trader781:

Всем привет, продолжаю дорабатывать то что уже есть

 Мы имеем неравномерную сетку ордеров и горизонтальную линию которая может быть в любом месте

нужно реализовать такое:

если у нас цена ниже линии закрыть все ордера

сложности заключаются в том что

1)  если ордера неравномерного типа и уже при выставлении линии кроется все что угодно,  а не тогда когда поставить разметить и установить (причем тогда еще надо какой то флаг вкл\откл)

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

 

 робот есть, кроме числовой метки уже все нарисовано, вопрос в правильном присвоении значений и обработке информации всей сетки.

Вот это посмотри, может подойдёт.
TralingLine
TralingLine
  • голосов: 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov:
Вот это посмотри, может подойдёт.
да, примерно то что и нужно, осталось только разобраться чтобы допилить под 4ку
 
Nauris Zukas:
Здравствуйте. Не пойму почему iTime иногда выдаёт неправильное время. На открытие новой свечи PERIOD_Н1 должно показаться время в журнале Print(iTime(NULL,PERIOD_M1,30)). В тестах всё правильно отображает, но в реале иногда время отличается даже на несколько часов. Почему так?
Vitaly Muzichenko:

Используйте CopyTime, Я также заметил эту проблему при построении графических объектов, и CopyTime проблему решил

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Я подумал, а если RefreshRates() поставить. Может это тоже поможет?
 
Nauris Zukas:
Я подумал, а если RefreshRates() поставить. Может это тоже поможет?
Не пробовал, сразу применил нормальное универсальное решение, и о проблеме забыл. 
 
Vitaly Muzichenko:
Не пробовал, сразу применил нормальное универсальное решение, и о проблеме забыл. 
Ок, ради интереса на одном терминале сделаю с RefreshRates() а на другом CopyTime.
 
trader781:
да, примерно то что и нужно, осталось только разобраться чтобы допилить под 4ку
Сначала просто откомпилируй под mql4 и проверь. Должно работать. Если не будет работать то вот старый код mql4. И даже с обработкой ошибок.

//*******************************************************************|
//|                                                  TralingLine.mq4 |
//|                                       Copyright © 2010, Viktorov |
//|                                                   v4forex@qip.ru |
//*******************************************************************|
#property copyright "Copyright © 2010, Viktorov"
#property link      "v4forex@qip.ru"

extern int     StopLevel   = 7;
extern color   ColorLine   = IndianRed;
extern bool    comment     =  false;

double prbuys, prsels, TICKVALUE, FixProfitBuy, FixProfitSel;
int Buy, Sel;

//****************expert initialization function*********************|
   bool     run         = True,
            Error       = False;
   int      slip        =  3;
   double   point,
            STOPLEVEL;
int init()
  {
  point  = Point;
  if((Digits == 3 || Digits == 5))
  {
  point  = Point*10;
  slip   *= 10;
  }
  run = True;
  Error = False;
TICKVALUE = MarketInfo(Symbol(), MODE_TICKVALUE);

   return(0);
}//******************************************************************|
double   nd(double v){return(NormalizeDouble(v,Digits));}
string   dts(double v){return(DoubleToStr(v, Digits));}
string   dts2(double v){return(DoubleToStr(v, 2));}
string   ttss(int v){return(TimeToStr(v,TIME_SECONDS));}
//*******************************************************************|
//|                     expert start function                        |
//*******************************************************************|
int start()
  {
     double nprbuys, nprsels;
   CountTrades();
  
   if(Buy > 0 && ObjectFind("StopBuy") == -1) drawline(OP_BUY);
   if(Sel > 0 && ObjectFind("StopSel") == -1) drawline(OP_SELL);
   if(ObjectFind("StopBuy") != -1)
   nprbuys = ObjectGetValueByShift("StopBuy", 0);
   if(ObjectFind("StopSel")!=-1)
   nprsels = ObjectGetValueByShift("StopSel", 0);
  
   if(nprbuys > 0 && Bid <= nprbuys)
   {
    CloseOrder(OP_BUY);
    if(ObjectFind("StopBuy") != -1) ObjectDelete("StopBuy");
   }
   if(nprsels > 0 && Ask >= nprsels)
   {
    CloseOrder(OP_SELL);
    if(ObjectFind("StopSel") != -1) ObjectDelete("StopSel");
   }
      FixProfit();
    if(comment)
   Comment("\n Текущее время  ", ttss(TimeCurrent())
         , "\n Ордера Buy закроются по цене ", dts(nprbuys), ". Фиксированная прибыль ", dts2(FixProfitBuy)
         , "\n Ордера Sell закроются по цене ", dts(nprsels), ". Фиксированная прибыль ", dts2(FixProfitSel)
         );
   return(0);
}//******************************************************************|
  
//********************Подсчёт профита всех ордеров*******************|
void FixProfit()
{  double LineB, LineS, Profit, tv;
   LineB = nd(ObjectGetValueByShift("StopBuy", 0));
   LineS = nd(ObjectGetValueByShift("StopSel", 0));
    tv = TICKVALUE; FixProfitBuy = 0; FixProfitSel = 0;
     int Total = OrdersTotal();
  
   for(int i = Total-1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
     if(OrderSymbol() == Symbol())
       {
        if(OrderType() == OP_BUY && LineB > 0)
         {
          if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineB;
          FixProfitBuy += (OrderCommission() + OrderSwap() + (LineB - OrderOpenPrice())*tv*OrderLots()/Point);
         }
        if(OrderType() == OP_SELL && LineS > 0)
         {
          if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineS;
          FixProfitSel += (OrderCommission() + OrderSwap() + (OrderOpenPrice() - LineS)*tv*OrderLots()/Point);
         }
       }
     Profit += OrderProfit();
     }
    }
}//******************************************************************|

//*******Подсчёт открытых ордеров OP_BUY & OP_BUYSTOP****************|
        void CountTrades()
           {   Buy = 0; Sel = 0;
            int Total = OrdersTotal();
            for(int i = 0; i < Total; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS))
              {
              if(OrderSymbol() == Symbol())
               {
               if(OrderType() == OP_BUY) Buy++;
                  if(OrderType() ==  OP_SELL) Sel++;
               }
              }
             }//for
           }//*******************************************************|

//**********************рисование линий******************************|
void drawline(int sig)
{
   double   Otstup_ = StopLevel*point;
    if(sig == OP_BUY)
     {
      prbuys = nd(iLow(NULL, 0, 1)-Otstup_);
       ObjectCreate("StopBuy", OBJ_TREND, 0, Time[0]+2*Period()*60, prbuys, Time[0]+4*Period()*60, prbuys);
       ObjectSet("StopBuy", OBJPROP_COLOR, ColorLine);
       ObjectSet("StopBuy", OBJPROP_STYLE, STYLE_DOT);
     }
    if(sig == OP_SELL)
     {
      prsels = nd(iHigh(NULL, 0, 1)+Otstup_);
       ObjectCreate("StopSel", OBJ_TREND, 0, Time[0]+2*Period()*60, prsels, Time[0]+4*Period()*60, prsels);  
       ObjectSet("StopSel", OBJPROP_COLOR, ColorLine);
       ObjectSet("StopSel", OBJPROP_STYLE, STYLE_DOT);
     }
   return;
}//******************************************************************|

//********************Закрытие ордеров*******************************|
void CloseOrder(int sig)
{     double GH, FE, c = 0; bool OrdClose; int Total = OrdersTotal();

            for(int i = 0; i < Total; i++)
              {
               OrdClose = False;
   if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol())
      {
      if(OrderType() == sig)
       {
      while(!OrdClose) // Цикл закрытия ордера 8 попыток
            {
      RefreshRates();
        if(OrderType() == OP_BUY)  GH = Bid;
   else if(OrderType() == OP_SELL) GH = Ask;
      OrdClose =  OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(GH, Digits), slip, CLR_NONE);
               if(OrdClose) i--;
         if(!OrdClose)
         {
      FE = Fun_Error(GetLastError());
            if(FE == 1) {  continue;   } // Повторная попытка
       else if(FE == 0) { Print("Неудачная попытка CloseOrder Error = ", GetLastError()); return;}
       else {  Print("Неудачная попытка CloseOrder"); return;   }
         }
            } // Цикл while(c < 8)
       }
      }
              }//for
   return;
}//******************************************************************|

//*********************Ф-ия обработки ошибок*************************|
int Fun_Error(int error)
{
      switch(error)
   { // Преодолимые ошибки
   case 0: return(1);
   case 4: //Print("Торговый сервер занят. Пробуем ещё раз...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 128:   //Истек срок ожидания совершения сделки
   return(1);
   case 6: //Print("Нет связи с торговым сервером. Пробуем ещё раз...");
   Sleep(10000); // Простое решение
   return(1); // Выход из функции
   case 129: //Print("Цена изменилась. Пробуем ещё раз...");
   return(1); // Выход из функции
   case 132: //Print("Рынок закрыт. Пробуем ещё раз...");
   Sleep(123000); // Простое решение
   return(1); // Выход из функции
   case 135: //Print("Цена изменилась. Пробуем ещё раз...");
   RefreshRates(); // Обновим данные
   return(1); // Выход из функции
   case 136: //Print("Нет цен. Ждём новый тик...");
   while(RefreshRates()==false) // До нового тика
   Sleep(1); // Задержка в цикле
   return(1); // Выход из функции
   case 137: //Print("Брокер занят. Пробуем ещё раз...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 138: //Print("Новые цены. Пробуем ещё раз...");
   Sleep(1); // Задержка в цикле
   return(1); // Выход из функции
   case 146: //Print("Подсистема торговли занята. Пробуем ещё...");
   Sleep(500); // Простое решение
   return(1); // Выход из функции
   case 4107: //Print("Неправильный параметр цены для торговой функции. Пробуем ещё...");
   Sleep(50); // Простое решение
   return(1); // Выход из функции
// Критические ошибки
   case 1:
   return(0);
   case 2: Alert("Общая ошибка. Перегрузите терминал и\или компьютер.");
   return(0); // Выход из функции
   case 5: Alert("Старая версия терминала.");
   //Work=false; // Больше не работать
   return(0); // Выход из функции
   case 64: Alert("Счет заблокирован.");
   //Work=false; // Больше не работать
   return(0); // Выход из функции
   case 130: //Alert("Неправильные стопы.");
   return(0); // Выход из функции
   case 133: Alert("Торговля запрещена.");
   return(0); // Выход из функции
   case 134: Alert("Недостаточно денег для совершения операции.");
   return(0); // Выход из функции
   case 4051: Alert("Недопустимое значение параметра функции.");
   return(0); // Выход из функции
   case 4108: Alert("Неверный номер тикета.");
   return(0); // Выход из функции
   default: //Print("Возникла ошибка ",Error); // Другие варианты
   return(0); // Выход из функции
   }
}//******************************************************************|

//****************expert deinitialization function*******************|
int deinit()
  {
  ObjectDelete("StopBuy");
  ObjectDelete("StopSel");
   return(0);
}//******************************************************************|

 
Nauris Zukas:
Ок, ради интереса на одном терминале сделаю с RefreshRates() а на другом CopyTime.
Проблема смещения времени хорошо проявлялась в тестере, поэтому RefreshRates может и не помочь.
 
Vitaly Muzichenko:
Проблема смещения времени хорошо проявлялась в тестере, поэтому RefreshRates может и не помочь.
Ясно, тогда делаю с CopyTime.
 

1. Есть какой-то удобный инструмент по синхронизации экспертов индикаторов и скриптов между терминалами?    (например на одном терминале программирую, затем нужно эксперта разослать в терминалы на которых идет торговля) 

 

2. Есть пример автоматического обновления (загрузки новой версии) эксперта на работающем графике?