テスターでSLとTPをドラッグ&ドロップします。 - ページ 12

 
Andrey Khatimlianskii:

自慢話?)

コードを表示するか、スレッドを閉じるか、どちらかです。

コードが散乱している。一部はExpert Advisorに、一部はインジケータに。Expert Advisorとインジケータの全体像は掲載しない。もし、あるパーツに興味があれば、掲載することも可能です。必要なものをお知らせください。
 
khorosh:
コードが散乱している。一部はExpert Advisorに、一部はインジケータに。Expert Advisorとインジケータの全体像は掲載しない。あるパーツに興味があれば、並べることもできますよ。具体的にどのようなものが必要なのか、お知らせください。

ただ、自分の問題がすでに解決しているのに、なぜスレッドを維持する必要があるのか、他の人は議論から何も得られないのか、理解できないのです。

建設的な追加を提案 )

 
Andrey Khatimlianskii:

ただ、自分の問題がすでに解決していて、他の人が議論から何も得られないのに、なぜスレッドを維持する必要があるのかが理解できないのです。

構築性を持たせるために提案されたもの )

OK, you got it )SLのドラッグ&ドロップの全てを掲載しています。TPについては、まだ特に必要ないので、やっていません。しかし、類推して行うのは問題ない。インジケータをそのまま貼り付けています。 SLのドラッグに関するものはEAから全て抜き出しています。私は言葉の革新を研究したわけではなく、昔ながらの方法でいろいろなことをやっているので、判断しないでください。

指標となるコード

//+------------------------------------------------------------------+
//|                                      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)関数に条件を1つ追加しておくとよいでしょう。バターでたくさんのお粥を台無しにすることはできないと言われるように)。

...
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:
はい、わかります。つまり、ストップがない注文の場合、注文自体のラインをドラッグすれば、そのラインを「ドラッグ」したところにストップが置かれるのです。持ち帰り加工がない場合です。また、ストップとトーの両方の処理があるにもかかわらず、注文にどちらもない場合、注文線を引くとしたら、何を設定すればいいのでしょうか?A Take or a Stop?
なるほど。そうすると、修正タイプを設定するためのボタンを追加するか、実際のチャートにある方法を使用する必要があります。TPやSLで何を取るべきかを決めるために、注文の値動きの最初の方向を設定する必要があります。私にとってはあまり重要ではなく、私の手動テスト用のEAでは、SLとTPは注文時にすぐに設定されるので、最初は考えませんでした。いいところを突いてきましたね。ありがとうございます、肝に銘じます。
 
khorosh:
了解です。そして、修正タイプを設定するボタンを追加で作るか、実際のチャートで行われている方法で行うか、どちらかです。注文価格から最初に動く方向で、TPやSLを引くべきかを判断する。
あるいは、キーパッドボタンと組み合わせることも可能です ;)
理由: