Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1130

 
Artyom Trishkin:
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
grazie, moderatore)
 
trader781:

Ciao a tutti, continuando a perfezionare ciò che abbiamo già

Abbiamo una griglia irregolare di ordini e una linea orizzontale che può essere ovunque

Dobbiamo implementare questo:

se il prezzo è sotto la linea chiudere tutti gli ordini

Le difficoltà sono le seguenti

1) se gli ordini sono di tipo non uniforme e già quando si imposta la linea si fa tutto, e non quando si mette la marcatura e si imposta la linea (in questo caso si dovrebbe impostare anche il flag on/off)

2) Implementazione di un'iscrizione in alto a destra della linea per tipo (se l'ordine viene chiuso a questo prezzo, il risultato sarà lo stesso per il saldo, cioè, dobbiamo cambiare la visualizzazione ogni tick e anche quando si sposta la linea; è generalmente simile a un trailing stop o sl se l'ordine viene piazzato manualmente, solo fluttuante e con la possibilità di trigger errati inizialmente)

Il robot è lì, a parte l'etichetta numerica tutto è già disegnato, la questione è nella corretta assegnazione dei valori e nell'elaborazione delle informazioni di tutta la griglia.

Dai un'occhiata a questo, forse funzionerà.
TralingLine
TralingLine
  • voti: 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov:
Guardate qui, forse ci sta bene.
Sì, questo è tutto ciò di cui abbiamo bisogno, dobbiamo solo capire come modificarlo per un 4
 
Nauris Zukas:
Salve. Non capisco perché iTime a volte dà l'ora sbagliata. L'apertura di una nuova candela PERIOD_H1 dovrebbe mostrare il tempo nel log Print(iTime(NULL,PERIOD_M1,30)). Visualizza tutto correttamente nei test, ma nella realtà l'ora è a volte diversa anche di diverse ore. Perché è così?
Vitaly Muzichenko:

UsateCopyTime, anche io ho notato questo problema quando costruivo oggetti grafici eCopyTime ha risolto il problema

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Mi chiedevo se è possibile impostare la funzione RefreshRates(). Forse sarà anche d'aiuto?
 
Nauris Zukas:
Mi chiedevo se RefreshRates() potesse essere inserito. Forse aiuterebbe anche questo?
Non l'ha provato, ha applicato immediatamente la normale soluzione universale e si è dimenticato del problema.
 
Vitaly Muzichenko:
Non ho provato, ho applicato subito una normale soluzione universale e ho dimenticato il problema.
Ok, per il bene dell'interesse lo farò con RefreshRates() su un terminale e CopyTime su un altro.
 
trader781:
Sì, è più o meno quello di cui ho bisogno, ora devo solo capire come passare al 4.
Prima basta compilare per mql4 e testare. Dovrebbe funzionare. In caso contrario, ecco il vecchio codice mql4. E anche con la gestione degli errori.

//*******************************************************************|
//|                                                  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, per il bene dell'interesse farò su un terminale con RefreshRates() e sull'altro con CopyTime.
Il problema dello spostamento temporale si mostrava bene nel tester, quindi RefreshRates potrebbe non aiutare.
 
Vitaly Muzichenko:
Il problema dell'offset temporale si è presentato bene nel tester, quindi RefreshRates potrebbe non aiutare.
Capisco, quindi fare con CopyTime.
 

1. Esiste uno strumento pratico per sincronizzare Expert Advisors, indicatori e script tra terminali? (per esempio, io programmo su un terminale, poi ho bisogno di inviare l'Expert Advisor ai terminali su cui faccio trading)

2. C'è un esempio di aggiornamento automatico (caricamento di una nuova versione) di un EA su un grafico funzionante?

Motivazione: