在测试器中拖放SL和TP。 - 页 12

 
Andrey Khatimlianskii:

吹牛?)

要么展示代码,要么关闭这个主题。

代码是散乱的。部分是在专家顾问中,部分是在指标中。我不会公布整个专家顾问和指标。如果你对某个部分感兴趣,我可以把它贴出来。请让我知道你到底需要什么。
 
khorosh:
代码是散乱的。部分是在专家顾问中,部分是在指标中。我不会公布整个专家顾问和指标。如果你对某个部分感兴趣,我可以把它摆出来。请说明你到底需要什么。

我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。

建议增加建设性的 )

 
Andrey Khatimlianskii:

我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。

建议增加一些建设性 )

好的,你明白了 )我正在发布关于拖放SL的所有信息。对于TP,我到目前为止还没有做,还不是特别需要。但通过类比的方式来做,并不是什么问题。我把指标的全部内容粘贴出来了。 我从EA中提取了所有关于拖动SL的内容。我没有研究过语言的创新,我做很多事情都是用老办法,所以不要评判。

指标代码。

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

来自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:

我还没有做TP,我还不是特别需要它。

这就是为什么有可能把开盘价 拉高,并把SL放在利润中;)

谢谢你的建设性反馈。

 
Andrey Khatimlianskii:

因此,有机会将开盘价 拉高,并将SL放入利润中;)

谢谢你的建设性反馈。

这与takeprofit有什么关系?
 
khorosh:
这与takeprofit有什么关系?
而当同样的东西被添加到TP时,我们将如何理解到底要修改什么?
 

你还应该给ModifYSL(double priceModifySL=0)函数添加一个条件,以防万一。正如他们所说,你不能用黄油糟蹋很多粥)。

...
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:
我们需要引入另一个全局变量 来修改TR。我把这个全局变量称为"ModifySL " 是有原因的。然后是GV的 "ModifyTP"。
是的,这很清楚。我的意思是:如果订单没有止损,我们可以拖动订单本身的线条,止损将被设置在我们 "拖动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?是采取还是停止?
 
Artyom Trishkin:
是的,我可以看到。我的意思是:如果订单没有止损,我们可以拖动订单本身的线条,止损将被放置在我们 "拖动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?采取还是停止?
我明白了。那么我们应该添加按钮来设置修改类型,或者按照我们在真实图表上的方式来做。我们应该设定订单价格运动的初始方向,以确定TP或SL应该采取什么措施。我一开始没有想到这一点,因为这对我来说不太重要,在我的手动测试策略的EA中,下单时立即设置SL和TP。你说得很有道理。谢谢你,我会牢记这一点。
 
khorosh:
明白了。然后,要么制作额外的按钮来设置修改类型,要么按照真实图表上的方式来做。从订单价格的初始运动方向来决定TP或SL应该拉到什么位置。
或者我们可以把它与键盘按钮结合起来;)