Arraste e solte SL e TP no testador. - página 12

 
Andrey Khatimlianskii:

Gabarolice? )

Ou mostrar o código ou fechar o fio.

O código está disperso. Parte dela está no Expert Advisor, parte dela está no indicador. Não afixarei todo o Expert Advisor e indicador. Se você estiver interessado em uma determinada parte, eu posso postá-la. Por favor, diga-me exatamente o que você precisa.
 
khorosh:
O código está disperso. Parte dela está no Expert Advisor, parte dela está no indicador. Não afixarei todo o Expert Advisor e indicador. Se você estiver interessado em uma determinada parte, eu posso apresentá-la. Por favor, informe o que exatamente você precisa.

Eu só não entendo porque você precisa manter um fio condutor se seu problema já foi resolvido e o resto de nós não conseguimos nada fora da discussão.

Sugerido para adicionar construtivo )

 
Andrey Khatimlianskii:

Eu só não entendo porque você precisa manter um fio condutor se seu problema já foi resolvido e o resto de nós não conseguimos nada fora da discussão.

Sugerido para acrescentar alguma construtividade )

Ok, você conseguiu ) Estou postando tudo sobre arrastar e soltar SL. Para a TP, ainda não o fiz até agora, não preciso particularmente dele ainda. Mas não é um problema fazer isso por analogia. Estou colando o indicador em sua totalidade. Retirei tudo o que se refere ao arrastamento do SL da EA. Não estudei as inovações da linguagem, faço muitas coisas à moda antiga, portanto, não julgue.

Código de indicador:

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

Peças 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:

Eu ainda não fiz um TP, ainda não preciso particularmente dele.

É por isso que é possível aumentar o preço de abertura e colocar um SL em lucro ;)

Obrigado pelo feedback construtivo.

 
Andrey Khatimlianskii:

Daí a oportunidade de puxar o preço de abertura para cima e colocar o SL em lucro ;)

Obrigado pelo feedback construtivo.

O que isso tem a ver com o takeprofit?
 
khorosh:
O que isso tem a ver com o takeprofit?
E como entenderemos exatamente o que modificar quando o mesmo for adicionado para TP?
 

Você também deve adicionar uma condição à função ModifYSL(double priceModifySL=0), por via das dúvidas. Como se diz, não se pode estragar muita papa com manteiga).

...
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:
Precisamos introduzir outra variável global para modificar o TR. Eu chamei a variável global"ModifySL" por uma razão.E depois há a GV "ModifyTP".
Sim, é claro. O que quero dizer é o seguinte: se a ordem não tem parada, podemos arrastar a linha da própria ordem e a parada será definida onde "arrastaremos" a linha para. Este é o caso se não tivermos processamento de take-out. E se tivermos processamento de ambas as paradas e dedos dos pés, mas a ordem não tem nenhuma, então se traçarmos a linha de ordem, o que devemos estabelecer? Uma tomada ou uma parada?
 
Artyom Trishkin:
Sim, eu posso ver isso. O que quero dizer é o seguinte: se a ordem não tem parada, podemos arrastar a linha da própria ordem, e a parada será definida para onde "arrastamos" a linha. Este é o caso se não tivermos processamento de take-out. E se tivermos processamento de ambas as paradas e dedos dos pés, mas a ordem não tem nenhuma, então se traçarmos a linha de ordem, o que devemos estabelecer? Um Take ou um Stop?
Estou vendo. Então, devemos adicionar botões para definir o tipo de modificação ou fazê-lo da forma como o fazemos em um gráfico real. Devemos definir a direção inicial do movimento de preços do pedido para determinar o que deve ser tomado pela TP ou SL. Não pensei nisso no início porque é de menor importância para mim e em minha EA para testes manuais de estratégias, SL e TP são definidos imediatamente ao fazer pedidos. Você fez um bom ponto de vista. Obrigado, vou ter isto em mente.
 
khorosh:
Entendi. Em seguida, ou faça botões adicionais para definir o tipo de modificação, ou faça-o da forma como é feito no gráfico real. A direção inicial do movimento do preço do pedido para determinar o que o TP ou SL deve puxar.
Ou podemos combiná-lo com botões de teclado ;)
Razão: