SL ve TP'yi test cihazına sürükleyip bırakın. - sayfa 12

 
Andrey Khatimlianskii :

Övünme? )

Ya kodu gösterin ya da konuyu kapatın.

Kod dağınık. Danışmanın bir parçası, göstergenin bir parçası. Tam danışman ve göstergeyi yayınlamayacağım. Ve belirli bir parçayla ilgileniyorsanız, onu yayınlayabilirim. Tam olarak neye ihtiyacınız olduğunu yazın.
 
khorosh :
Kod dağınık. Danışmanın bir parçası, göstergenin bir parçası. Tam danışman ve göstergeyi yayınlamayacağım. Ve belirli bir parçayla ilgileniyorsanız, onu yayınlayabilirim. Tam olarak neye ihtiyacınız olduğunu yazın.

Sorununuz zaten çözülmüşse ve tartışmanın geri kalanı hiçbir şey almayacaksa neden bir ileti dizisi sürdürdüğünü anlamıyorum.

Bir yapı eklemek için önerilir)

 
Andrey Khatimlianskii :

Sorununuz zaten çözülmüşse ve tartışmanın geri kalanı hiçbir şey almayacaksa neden bir ileti dizisi sürdürdüğünü anlamıyorum.

Bir yapı eklemek için önerilir)

Tamam, ikna ettim.) SL'yi sürüklemekle ilgili her şeyi yayın. TP için henüz yapmadım, henüz özellikle gerekli değil. Eh, benzetme ile, bu bir sorun değil. Göstergeyi tamamen yaydım ve danışmandan SL'yi sürüklemekle ilgili her şeyi çıkardım. Dilin yeniliklerini incelemedim, çoğu şeyi eski usulden yapıyorum, bu yüzden beni suçlamayın.

Gösterge kodu:

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

Danışmandan parçalar:

 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 için henüz yapmadım, henüz özellikle gerekli değil.

Böylece açılış fiyatını yukarı çekip SL'yi kâra geçirmek mümkün oldu ;)

Yapıcı için teşekkürler.

 
Andrey Khatimlianskii :

Böylece açılış fiyatını yukarı çekip SL'yi kâra geçirmek mümkün oldu ;)

Yapıcı için teşekkürler.

Ve bunun kar almakla nasıl bir ilgisi var?
 
khorosh :
Ve bunun kar almakla nasıl bir ilgisi var?
Ve aynı şey TP için eklendiğinde tam olarak neyi değiştireceğimizi nasıl anlayacağız?
 

Orada, her ihtimale karşı ModifYSL(double priceModifySL=0) işlevine bir koşul eklemeniz gerekir. Dedikleri gibi, yulaf lapasını tereyağı ile bozamazsınız.)

...
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'yi değiştirmek için bir global değişkenin daha tanıtılması gerekiyor. Global değişkeni " ModifySL" olarak adlandırdım. Ve başka bir GV "ModifyTP" olacak.
Evet, bu anlaşılabilir. Anlatılmak istenen şudur: emrin bir durağı yoksa, emrin satırını sürükleyebilirsiniz ve stop, satırı "sürüklediğimiz" yere yerleştirilir. Bu, alma işlemi olmaması durumunda geçerlidir. Ve hem stop hem de alma işlemi varsa, ancak siparişin ne biri ne de diğeri yoksa, o zaman sipariş satırını sürüklerseniz, o zaman ne ayarlanmalıdır? Al veya dur?
 
Artyom Trishkin :
Evet, bu anlaşılabilir. Anlatılmak istenen şudur: emrin bir durağı yoksa, emrin satırını sürükleyebilirsiniz ve stop, satırı "sürüklediğimiz" yere yerleştirilir. Bu, alma işlemi olmaması durumunda geçerlidir. Ve hem stop hem de alma işlemi varsa, ancak siparişin ne biri ne de diğeri yoksa, o zaman sipariş satırını sürüklerseniz, o zaman ne ayarlanmalıdır? Al veya dur?
Anladım. Ardından, değişiklik türünü ayarlamak için ek düğmeler yapın veya bunu gerçek bir grafikte yapıldığı gibi yapın. Emrin fiyatından hareketin ilk yönü, hangi TP veya SL'nin çekilmesi gerektiğini belirler. Her nasılsa bunu düşünmedim, çünkü benim için bu, Stratejilerin manuel olarak test edilmesi için Uzman Danışmanımda, sipariş verirken SL ve TP'nin hemen kurulduğu gerçeği göz önüne alındığında, bu ikincil bir meseledir. Haklı olarak not edildi. Teşekkürler, aklımda tutacağım.
 
khorosh :
Anladım. Ardından, değişiklik türünü ayarlamak için ek düğmeler yapın veya bunu gerçek bir grafikte yapıldığı gibi yapın. Emrin fiyatından hareketin ilk yönü, hangi TP veya SL'nin çekilmesi gerektiğini belirler.
Ve klavye butonları ile birleştirebilirsiniz ;)