테스터에 SL과 TP를 끌어다 놓습니다. - 페이지 12

 
Andrey Khatimlianskii :

자랑? )

코드를 보여주거나 주제를 닫으십시오.

코드가 흩어져 있습니다. 조언자의 일부, 지표의 일부. 전체 고문과 지표를 게시하지 않을 것입니다. 그리고 특정 부분에 관심이 있으시면 게시할 수 있습니다. 필요한 것을 정확히 기록하십시오.
 
khorosh :
코드가 흩어져 있습니다. 조언자의 일부, 지표의 일부. 전체 고문과 지표를 게시하지 않을 것입니다. 그리고 특정 부분에 관심이 있으시면 게시할 수 있습니다. 필요한 것을 정확히 기록하십시오.

나는 당신의 문제가 이미 해결되었고 나머지 토론에서 아무 것도 얻지 못한다면 왜 스레드를 유지하는지 이해할 수 없습니다.

구성을 추가하는 것이 좋습니다)

 
Andrey Khatimlianskii :

나는 당신의 문제가 이미 해결되었고 나머지 토론에서 아무 것도 얻지 못한다면 왜 스레드를 유지하는지 이해할 수 없습니다.

구성을 추가하는 것이 좋습니다)

좋아요, 설득했습니다.) SL 드래그와 관련된 모든 것을 퍼뜨립니다. TP의 경우 아직 해보지 않았고 특별히 필요하지는 않습니다. 글쎄요, 유추해 보면 문제가 되지 않습니다. 나는 지표를 완전히 펼치고 어드바이저에서 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" );
        }
} 

고문의 말:

 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을 이익 으로 내놓는 것이 가능해졌습니다.)

건설적인 주셔서 감사합니다.

그리고 이것이 이익을 얻는 것과 어떤 관련이 있습니까?
 
khorosh :
그리고 이것이 이익을 얻는 것과 어떤 관련이 있습니까?
그리고 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이 무엇을 빼야 하는지를 결정합니다. 어떻게 든 나는 그것에 대해 생각하지 않았습니다. 왜냐하면 전략의 수동 테스트를위한 Expert Advisor에서 주문할 때 SL 및 TP가 즉시 설치된다는 사실을 고려할 때 이것은 부차적 인 문제입니다. 제대로 지적했다. 감사합니다. 명심하겠습니다.
 
khorosh :
이해했다. 그런 다음 수정 유형을 설정하는 추가 버튼을 만들거나 실제 차트에서 수행되는 대로 수행합니다. 주문 가격에서 이동의 초기 방향은 TP 또는 SL이 무엇을 빼야 하는지를 결정합니다.
그리고 당신은 키보드 버튼과 결합할 수 있습니다;)