Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1130

 
Artyom Trishkin:
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
merci, modérateur)
 
trader781:

Bonjour à tous, je continue à affiner ce que nous avons déjà

Nous avons une grille d'ordres irrégulière et une ligne horizontale qui peut être n'importe où.

Nous devons mettre cela en œuvre :

si le prix est en dessous de la ligne, fermez tous les ordres.

Les difficultés sont les suivantes

1) si les commandes sont de type non-uniforme et que déjà lors de l'établissement de la ligne tout est fait, et non pas lorsque nous mettons le marquage et établissons la ligne (dans ce cas nous devrions également établir le drapeau on/off)

2) Mise en place d'une inscription en haut à droite de la ligne par type (si l'ordre est clôturé à ce prix, le résultat sera le même pour le solde, c'est-à-dire qu'il faut changer l'affichage à chaque tick et aussi lors du déplacement de la ligne ; c'est en général similaire à un trailing stop ou sl si l'ordre est placé manuellement, seulement flottant et avec la possibilité de déclenchements erronés au départ).

Le robot est là, à l'exception du marqueur numérique tout est déjà dessiné, la question est dans l'attribution correcte des valeurs et le traitement de l'information de toute la grille.

Jetez un coup d'œil à celui-ci, peut-être que ça marchera.
TralingLine
TralingLine
  • votes : 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov:
Regarde ça, ça t'ira peut-être.
Ouais, c'est à peu près tout ce dont on a besoin, il faut juste trouver comment le modifier pour un 4.
 
Nauris Zukas:
Bonjour. Je ne comprends pas pourquoi iTime donne parfois la mauvaise heure. L'ouverture d'une nouvelle bougie PERIOD_H1 doit faire apparaître l'heure dans le journal Print(iTime(NULL,PERIOD_M1,30)). Il affiche tout correctement lors des tests, mais en réalité l'heure est parfois différente, même de plusieurs heures. Pourquoi en est-il ainsi ?
Vitaly Muzichenko:

UtilisezCopyTime, j'ai également remarqué ce problème lors de la construction d'objets graphiques etCopyTime a résolu le problème.

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Je me demandais si vous pouviez définir la fonction RefreshRates(). Peut-être cela aidera-t-il aussi ?
 
Nauris Zukas:
Je me suis demandé s'il était possible d'intégrer la fonction RefreshRates(). Peut-être que ça aiderait aussi ?
Je ne l'ai pas essayé, j'ai immédiatement appliqué la solution universelle normale et j'ai oublié le problème.
 
Vitaly Muzichenko:
Je n'ai pas essayé, j'ai appliqué une solution universelle normale en une fois et j'ai oublié le problème.
Ok, pour le plaisir, je vais le faire avec RefreshRates() sur un terminal et CopyTime sur un autre.
 
trader781:
Oui, c'est à peu près ce dont j'ai besoin, maintenant je dois juste trouver comment passer à la version 4.
D'abord, il suffit de compiler pour mql4 et de tester. Cela devrait fonctionner. Sinon, voici l'ancien code mql4. Et même avec la gestion des erreurs.

//*******************************************************************|
//|                                                  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:
OK, pour le bien de l'intérêt, je vais faire sur un terminal avec RefreshRates() et sur l'autre avec CopyTime.
Le problème de décalage horaire apparaissait bien dans le testeur, donc les taux de rafraîchissement peuvent ne pas aider.
 
Vitaly Muzichenko:
Le problème de décalage temporel est bien apparu dans le testeur, donc les RefreshRates pourraient ne pas aider.
Je vois, alors faire avec CopyTime.
 

1. Existe-t-il un outil pratique pour synchroniser les Expert Advisors, les indicateurs et les scripts entre les terminaux ? (par exemple, je programme sur un terminal, puis je dois envoyer le Conseiller Expert aux terminaux sur lesquels je trade)

2. Existe-t-il un exemple de mise à jour automatique (chargement d'une nouvelle version) d'un EA sur un graphique de travail ?