[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 628

 
hoz:


それはありますね。これが修正方法です。

そして、修正機能はこちら。

Strange でも、また出力にストップ&テイクがないんです。



OrderSelect(g_ticket,SELECT_BY_TICKET) 行の前 if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History、History_Draw - これらはテスト中にExpert Advisorのように動作します。

与えられたパラメータによる履歴の補正を見るには、以下のようなものが必要です。


歴史に、それともチャートに?もし「はい」なら、どのようなデータをチャートウィンドウで、別ウィンドウで、表として、異なる色のローソク 足で、または動きの始まりと終わりを結ぶ線で表示したいですか?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) 行の前 if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


それが、私の仕事です。

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

ストップ高やテイクオーバーはありません。ログには、ストップがおかしいとエラー130と 書かれています。その理由がわからない。

 
hoz:


それが、私の仕事です。

ストップ高やテイクオーバーはありません。ログには、ストップがおかしいとエラー130と書かれています。理由がわからない。


ifを使わず、OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);とすれば、OrdersModifying()に残しておくことができます。

//+------------------------------------------------------------------+

void OrdersModifying()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);

if(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // ストップロス入力パラメータが0でないとき。

//選択された注文の ストップロスの値を取得します。

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // TakeProfit入力パラメータが0に等しくない場合...

// 選択された注文のTakeProfitの値を取得します。

}

if(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // ストップロスの入力パラメータが0でないとき。

// 選択された注文のストップロスの値を取得します。

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // TakeProfit入力パラメータが0に等しくない場合...

// 選択された注文のTakeProfitの値を取得します。

}

if(sl != 0 || tp !)= 0)// 得られたslとtpの値が0に等しくない場合。.

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // 注文を修正する。

}

}


 
anton.veksler:

Symbol() MT4で問題が発生しました。

2つの機能で説明します。

を実行すると、空文字列が出力されます。

しかし、2番目の関数は、文字列ID "EURUSD "を出力します(まあ、チャートに依存しますが、関数のロジックによると、それは空の文字列になるはずですが、出力されます)。

何が問題なのか理解するのを助けてください。ありがとうございました。


変数の宣言時に予約名(value)を使用することはできず、_valueと呼びます。
 
hoz:


それが、私の仕事です。

ストップ高やテイクオーバーはありません。ログにはエラー130とあり、ストップがおかしいと書いてある。理由がわからない。

そして、彼らはそうしない!

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly さん、言われたとおりやってみましたが、何も変わりませんね。どうやらバグはどこかに埋まっているようです。

以前はすべて(新規注文-設定した価格レベルに達したときに変更し、B.W.に転送)、すべてうまくいっていました。こんな感じでしたね。

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

今は、すべてを特定の専門的な機能に分解したため、すべてがすこぶるうまくいかなくなったのです。両方の方法を試しましたが、何もうまくいきません。ストップが設定されません。

 
borilunad:

そして、彼らはそうしない!

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

どこが論理的なんだ?理解したい...以下はその機能です。

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

入力変数i_slと i_tpが 0に等しくない場合、すでにオーダーにあるであろうストップとテイクの価格、つまりslとtpを 取得することができます。その後、ここでSLとTPを 計算したかどうか確認します(ショートの場合)

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

もし値が得られたら、その値はゼロにはならない...なぜなら、値が変わってしまうからだ!これらは、コードコンテキストによって逐次取得する変数です。

そして、ここで、stopとtakeの値が見つかったかどうかを確認しました。これだけ条件が揃っていて、どうしてゼロなんだ?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

まず最初にロジックを構築し、次に関数やファイルなどを行う。

なぜ左手を右耳の後ろで掻くのか!

 

私の関数は、パラメータ宣言から始まりますが、Kimさんのものをご覧ください

void ModifyOrder(int ticket, double pp, double sl, double tp, datetime e, color arrow_cl)