Ziehen Sie SL und TP per Drag & Drop in das Prüfgerät. - Seite 12

 
Andrey Khatimlianskii:

Prahlerei? )

Zeigen Sie entweder den Code oder schließen Sie den Thread.

Der Code ist verstreut. Ein Teil davon befindet sich im Expert Advisor, ein anderer Teil im Indikator. Ich werde nicht den gesamten Expert Advisor und Indikator veröffentlichen. Wenn Sie an einem bestimmten Teil interessiert sind, kann ich es veröffentlichen. Bitte beziehen Sie sich auf das, was Sie brauchen.
 
khorosh:
Der Code ist verstreut. Ein Teil davon befindet sich im Expert Advisor, ein anderer Teil im Indikator. Ich werde nicht den gesamten Expert Advisor und Indikator veröffentlichen. Wenn Sie sich für ein bestimmtes Teil interessieren, kann ich es Ihnen zur Verfügung stellen. Bitte teilen Sie uns mit, was genau Sie benötigen.

Ich verstehe nur nicht, warum Sie einen Thread aufrechterhalten müssen, wenn Ihr Problem bereits gelöst ist und wir anderen nichts von der Diskussion haben.

Vorgeschlagen, konstruktiv hinzuzufügen )

 
Andrey Khatimlianskii:

Ich verstehe nur nicht, warum Sie einen Thread aufrechterhalten müssen, wenn Ihr Problem bereits gelöst ist und wir anderen nichts von der Diskussion haben.

Vorgeschlagen, um etwas Konstruktivität hinzuzufügen)

Ok, du hast es verstanden :) Ich schreibe alles über das Ziehen und Ablegen von SL. Für TP habe ich bisher nicht getan, ich brauche es noch nicht besonders. Aber es ist kein Problem, dies analog zu tun. Ich füge den Indikator in seiner Gesamtheit ein. Ich habe alles, was das Ziehen von SL betrifft, aus dem EA gezogen. Ich habe die Neuerungen der Sprache nicht studiert, ich mache viele Dinge auf die altmodische Art, also urteilen Sie nicht.

Code des Indikators:

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

Teile von 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:

Ich habe noch kein TP gemacht, ich brauche es noch nicht unbedingt.

Deshalb ist es möglich, den Eröffnungskurs nach oben zu ziehen und einen SL im Gewinn zu platzieren ;)

Vielen Dank für das konstruktive Feedback.

 
Andrey Khatimlianskii:

Das ist die Gelegenheit, den Eröffnungskurs nach oben zu ziehen und den SL in den Gewinn zu bringen ;)

Vielen Dank für das konstruktive Feedback.

Was hat das mit Takeprofit zu tun?
 
khorosh:
Was hat das mit Takeprofit zu tun?
Und wie werden wir verstehen, was genau zu ändern ist, wenn das Gleiche für TP hinzugefügt wird?
 

Sie sollten auch eine Bedingung zur Funktion ModifYSL(double priceModifySL=0) hinzufügen, nur für den Fall. Wie man so schön sagt, kann man eine Menge Brei nicht mit Butter verderben).

...
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:
Wir müssen eine weitere globale Variable einführen, um die TR zu ändern. Ich habe die globale Variable nicht ohne Grund"ModifySL" genannt. Und dann ist da noch die GV "ModifyTP".
Ja, das ist klar. Was ich meine, ist Folgendes: Wenn der Auftrag keinen Stop hat, können wir die Linie des Auftrags selbst ziehen und der Stop wird dort gesetzt, wohin wir die Linie "ziehen". Dies ist der Fall, wenn wir keine Mitnahmeabwicklung haben. Und wenn wir sowohl Stopps als auch Zehenspitzen verarbeiten, der Auftrag aber weder das eine noch das andere hat, was sollen wir dann einstellen, wenn wir die Auftragslinie ziehen? Mitnehmen oder anhalten?
 
Artyom Trishkin:
Ja, das kann ich sehen. Was ich meine, ist Folgendes: Wenn der Auftrag keinen Stopp hat, können wir die Linie des Auftrags selbst ziehen, und der Stopp wird dort platziert, wohin wir die Linie "ziehen". Dies ist der Fall, wenn wir keine Mitnahmeabwicklung haben. Und wenn wir sowohl Stopps als auch Zehenspitzen verarbeiten, der Auftrag aber weder das eine noch das andere hat, was sollen wir dann einstellen, wenn wir die Auftragslinie ziehen? Einnehmen oder Anhalten?
Ich verstehe. Dann sollten wir entweder Schaltflächen hinzufügen, um den Änderungstyp festzulegen, oder die Methode verwenden, die wir im echten Diagramm haben. Wir sollten die anfängliche Richtung der Preisbewegung der Order festlegen, um zu bestimmen, was von TP oder SL genommen werden sollte. Ich habe zunächst nicht darüber nachgedacht, weil es für mich nicht so wichtig ist und in meinem EA zum manuellen Testen von Strategien SL und TP sofort bei der Auftragserteilung gesetzt werden. Sie haben ein gutes Argument vorgebracht. Danke, ich werde das im Hinterkopf behalten.
 
khorosh:
Ich hab's. Machen Sie dann entweder zusätzliche Schaltflächen, um die Art der Änderung einzustellen, oder machen Sie es so, wie es in der echten Karte gemacht wird. Die anfängliche Bewegungsrichtung des Auftragspreises, um zu bestimmen, was der TP oder SL ziehen sollte.
Oder wir können sie mit den Tasten des Tastenfelds kombinieren ;)