Faites glisser et déposez SL et TP dans le testeur. - page 12

 
Andrey Khatimlianskii:

Se vanter ? )

Soit vous montrez le code, soit vous fermez le fil.

Le code est éparpillé. Une partie se trouve dans le conseiller expert, une autre dans l'indicateur. Je ne vais pas publier l'intégralité du conseiller expert et de l'indicateur. Si vous êtes intéressé par une certaine pièce, je peux l'afficher. Faites-moi savoir ce dont vous avez besoin exactement.
 
khorosh:
Le code est éparpillé. Une partie se trouve dans le conseiller expert, une autre dans l'indicateur. Je ne vais pas publier l'intégralité du conseiller expert et de l'indicateur. Si vous êtes intéressé par une certaine partie, je peux l'exposer. Veuillez indiquer ce dont vous avez besoin exactement.

Je ne comprends pas pourquoi vous devez maintenir un fil de discussion si votre problème a déjà été résolu et que le reste d'entre nous ne retire rien de la discussion.

Suggestion d'ajout constructif :)

 
Andrey Khatimlianskii:

Je ne comprends pas pourquoi vous devez maintenir un fil de discussion si votre problème a déjà été résolu et que le reste d'entre nous ne retire rien de la discussion.

Suggéré pour ajouter un peu de constructivité)

Ok, tu l'as :) J'affiche tout ce qui concerne le glisser-déposer de SL. Pour le TP, je ne l'ai pas fait jusqu'à présent, n'en ayant pas encore particulièrement besoin. Mais ce n'est pas un problème de le faire par analogie. Je colle l'indicateur dans son intégralité, j'ai supprimé tout ce qui concerne le déplacement du SL de l'EA. Je n'ai pas étudié les innovations de la langue, je fais beaucoup de choses à l'ancienne, alors ne jugez pas.

Code de l'indicateur :

//+------------------------------------------------------------------+
//|                                      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");
        }
} 

Pièces de 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:

Je n'ai pas encore fait de TP, je n'en ai pas particulièrement besoin pour le moment.

C'est pourquoi il est possible de tirer le prix d'ouverture vers le haut et de mettre un SL en profit ;)

Merci pour les commentaires constructifs.

 
Andrey Khatimlianskii:

D'où l'opportunité de tirer le prix d'ouverture vers le haut et de mettre le SL en profit ;)

Merci pour les commentaires constructifs.

Qu'est-ce que cela a à voir avec takeprofit ?
 
khorosh:
Qu'est-ce que cela a à voir avec takeprofit ?
Et comment comprendrons-nous exactement ce qu'il faut modifier lorsque la même chose sera ajoutée pour le TP ?
 

Vous devez également ajouter une condition à la fonction ModifYSL(double priceModifySL=0), au cas où. Comme on dit, on ne peut pas gâcher beaucoup de porridge avec du beurre).

...
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:
Nous devons introduire une autre variable globale pour modifier le TR. J'ai appelé la variable globale"ModifySL" pour une raison. Et puis il y a le GV "ModifyTP".
C'est compréhensible. Ce que je veux dire, c'est que si l'ordre n'a pas de stop, nous pouvons faire glisser la ligne de l'ordre lui-même et le stop sera fixé là où nous faisons "glisser" la ligne. C'est le cas si nous n'avons pas de traitement à emporter. Et si nous avons le traitement à la fois des stops et des toes, mais que l'ordre n'en a aucun, alors si nous traçons la ligne de l'ordre, que devons-nous fixer ? Une prise ou un arrêt ?
 
Artyom Trishkin:
Oui, je peux voir ça. Ce que je veux dire, c'est que si l'ordre n'a pas de stop, nous pouvons faire glisser la ligne de l'ordre lui-même, et le stop sera placé là où nous faisons "glisser" la ligne. C'est le cas si nous n'avons pas de traitement TP. Et si nous avons le traitement à la fois des stops et des toes, mais que l'ordre n'en a aucun, alors si nous traçons la ligne de l'ordre, que devons-nous fixer ? Une prise ou un arrêt ?
Je vois. Ensuite, nous devrions soit ajouter des boutons pour définir le type de modification, soit procéder de la même manière que sur un vrai graphique. Nous devons définir la direction initiale du mouvement du prix de l'ordre pour déterminer ce qui doit être pris par le TP ou le SL. Je n'y ai pas pensé au début parce que ce n'est pas une question très importante pour moi et que dans mon EA pour le test manuel des stratégies, le SL et le TP sont définis immédiatement lors de la passation des ordres. Vous avez soulevé un bon point. Merci, je vais garder cela à l'esprit.
 
khorosh:
Je l'ai. Ensuite, soit vous créez des boutons supplémentaires pour définir le type de modification, soit vous le faites de la manière dont cela se fait sur le graphique réel. La direction initiale du mouvement à partir du prix de l'ordre pour déterminer ce que le TP ou le SL doit tirer.
Ou nous pouvons le combiner avec les boutons du clavier ;)