Trascinate SL e TP nel tester. - pagina 12

 
Andrey Khatimlianskii:

Vantarsi? )

O mostri il codice o chiudi il thread.

Il codice è sparso. In parte è nell'Expert Advisor, in parte nell'indicatore. Non posterò l'intero Expert Advisor e l'indicatore. Se siete interessati a una certa parte, posso pubblicarla. Per favore, fatemi sapere di cosa avete bisogno esattamente.
 
khorosh:
Il codice è sparso. In parte è nell'Expert Advisor, in parte nell'indicatore. Non posterò l'intero Expert Advisor e l'indicatore. Se vi interessa una certa parte, posso stenderla. Si prega di avvisare di cosa avete bisogno esattamente.

Non capisco perché avete bisogno di mantenere un thread se il vostro problema è già stato risolto e il resto di noi non ottiene nulla dalla discussione.

Suggerito per aggiungere costruttivo )

 
Andrey Khatimlianskii:

Non capisco perché avete bisogno di mantenere un thread se il vostro problema è già stato risolto e il resto di noi non ottiene nulla dalla discussione.

Suggerito per aggiungere un po' di costruttività)

Ok, hai capito :) Sto pubblicando tutto ciò che riguarda il trascinamento di SL. Per TP, non ho fatto finora, non particolarmente bisogno ancora. Ma non è un problema farlo per analogia. Sto incollando l'indicatore nella sua interezza. Ho rimosso tutto ciò che riguarda il trascinamento di SL dall'EA. Non ho studiato le innovazioni della lingua, faccio molte cose alla vecchia maniera, quindi non giudicate.

Codice dell'indicatore:

//+------------------------------------------------------------------+
//|                                      Test_ChartXYToTimePrice.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "khorosh"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
if(!GlobalVariableCheck(GetNameTF(Period())+" "+Symbol()+" ModifySL"))
  {  
   GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", 0.0);
  }
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id==CHARTEVENT_MOUSE_MOVE && IsTesting())
     {
      if(MouseState((uint)sparam)=="DN")
        {
      //--- подготовим переменные
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
      //--- преобразуем координаты X и Y  в терминах дата/время
      if(ChartXYToTimePrice(0,x,y,window,dt,price))
         //--- сделаем обратное преобразование: (X,Y) => (Time,Price)
         if(ChartTimePriceToXY(0,window,dt,price,x,y))
           {
            GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", StringToDouble(price));
           }   
         else
            Print("ChartTimePriceToXY return error code: ",GetLastError());
        }
      else
         Print("ChartXYToTimePrice return error code: ",GetLastError());
      Print("+--------------------------------------------------------------+");
    }
   if(MouseState((uint)sparam)=="UP") {GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", 0.0);} 
  }  
}
string MouseState(uint state) 
  { 
    string res; 
   res+=(((state& 1)== 1)?"DN":"UP");   // mouse left 
   return(res); 
  } 
 //+----------------------------------------------------------------------------+
//|  Возвращает наименование таймфрейма                                        |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
        switch (TimeFrame) {
                case PERIOD_M1:  return("M1");
                case PERIOD_M5:  return("M5");
                case PERIOD_M15: return("M15");
                case PERIOD_M30: return("M30");
                case PERIOD_H1:  return("H1");
                case PERIOD_H4:  return("H4");
                case PERIOD_D1:  return("Daily");
                case PERIOD_W1:  return("Weekly");
                case PERIOD_MN1: return("Monthly");
                default:                     return("UnknownPeriod");
        }
} 

Pezzi da EA:

double PriceModifySL   = 0.0;
int TicketModifSlOrder = 0;
int StopLevel = 0;
void OnTick()
 {
//---
StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(IsTesting()) {PriceModifySL = GlobalVariableGet(GetNameTF(Period())+" "+Symbol()+" ModifySL");}
else {PriceModifySL=0;}
if(PriceModifySL==0.0) {TicketModifSlOrder=0;}
if(IsTesting() && PriceModifySL>0.0001) {ModifYSL(PriceModifySL);}
 
//---
  }
//================================================================================================================================+
//                                                         ФУНКЦИИ                                                                |
//================================================================================================================================+
void ModifYSL(double priceModifySL=0)
 {
  double sl=0;
  if(TicketModifSlOrder==0)
    {  
     for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderStopLoss()-priceModifySL)<20*Point) 
               { 
                TicketModifSlOrder=OrderTicket(); break;
               }
            }
         }  
      }
    }
   if(TicketModifSlOrder==0)
     {
      for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderOpenPrice()-priceModifySL)<30*Point) 
               { 
                TicketModifSlOrder=OrderTicket(); break;
               }
            }
         }  
      }
     }     
   if(OrderSelect(TicketModifSlOrder, SELECT_BY_TICKET))
     {
      sl=priceModifySL;                                
      if(MathAbs(sl-Ask)>StopLevel*Point() && MathAbs(sl-Bid)>StopLevel*Point())
        { 
         ModifyOrder1(-1, sl, -1, 0);
        }           
     }
 }
//=================================================================================================================================
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder1(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);

  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        PlaySound("wait.wav"); break;
      } else {
        er=GetLastError();
        PlaySound("timeout.wav");
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
 
khorosh:

Non ho ancora fatto un TP, non ne ho ancora particolarmente bisogno.

Ecco perché è possibile tirare il prezzo di apertura verso l'alto e mettere uno SL in profitto ;)

Grazie per il feedback costruttivo.

 
Andrey Khatimlianskii:

Da qui l'opportunità di tirare il prezzo di apertura verso l'alto e mettere lo SL in profitto ;)

Grazie per il feedback costruttivo.

Cosa ha a che fare questo con il takeprofit?
 
khorosh:
Cosa ha a che fare questo con il takeprofit?
E come capiremo esattamente cosa modificare quando lo stesso sarà aggiunto per TP?
 

Dovreste anche aggiungere una condizione alla funzione ModifYSL(double priceModifySL=0) per sicurezza. Come si dice, non si può rovinare un sacco di porridge con il burro).

...
if(TicketModifSlOrder>0) // Вот это!!!
  {
   if(OrderSelect(TicketModifSlOrder, SELECT_BY_TICKET))
     {
      sl=priceModifySL;                                
      if(MathAbs(sl-Ask)>StopLevel*Point() && MathAbs(sl-Bid)>StopLevel*Point())
        { 
         ModifyOrder1(-1, sl, -1, 0);
        }           
     }
  }



 
khorosh:
Dobbiamo introdurre un'altra variabile globale per modificare il TR. Ho chiamato la variabile globale"ModifySL" per un motivo.E poi c'è il GV "ModifyTP".
Sì, è chiaro. Quello che voglio dire è questo: se l'ordine non ha stop, possiamo trascinare la linea dell'ordine stesso e lo stop sarà impostato dove "trasciniamo" la linea. Questo è il caso in cui non abbiamo un trattamento da asporto. E se abbiamo l'elaborazione di entrambi gli stop e le punte, ma l'ordine non ha nessuno dei due, allora se disegniamo la linea dell'ordine, cosa dovremmo impostare? Una presa o una fermata?
 
Artyom Trishkin:
Sì, lo vedo. Quello che voglio dire è questo: se l'ordine non ha stop, possiamo trascinare la linea dell'ordine stesso, e lo stop sarà posizionato dove "trasciniamo" la linea. Questo è il caso se non abbiamo l'elaborazione TP. E se abbiamo l'elaborazione di entrambi gli stop e le punte, ma l'ordine non ha nessuno dei due, allora se disegniamo la linea dell'ordine, cosa dovremmo impostare? Una presa o uno stop?
Capisco. Allora dovremmo aggiungere dei pulsanti per impostare il tipo di modifica o farlo nel modo in cui lo facciamo su un grafico reale. Dovremmo impostare la direzione iniziale del movimento del prezzo dell'ordine per determinare cosa dovrebbe essere preso da TP o SL. Non ci ho pensato all'inizio perché è meno importante per me e nel mio EA per il test manuale delle strategie, SL e TP sono impostati immediatamente quando si piazzano gli ordini. Avete fatto un buon punto. Grazie, lo terrò presente.
 
khorosh:
Capito. Allora o fate dei pulsanti aggiuntivi per impostare il tipo di modifica, o fatelo nel modo in cui è fatto sul grafico reale. La direzione iniziale del movimento dal prezzo dell'ordine per determinare quale TP o SL dovrebbe tirare.
Oppure possiamo combinarlo con i pulsanti della tastiera ;)
Motivazione: