MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 471

 
Vadim Novikov:

気になる皆さん、こんにちは


私は上級者ですが、それほど頻繁には書きません。 そのため、いくつかの技術革新についていけないし、時には忘れてしまうこともあります。


ひとつだけ思い出せないことがあるので、助けてください。


こんな状況です。 extern変数を定義しました。 たくさん定義しました。20個の変数です。本プログラムをチャートに貼り付けると、プログラムの入力メニューに表示されます。


ここで質問なのですが、思い出せないのですが、これらの変数のブロックをどのようにコメントで区切ればいいのでしょうか? 入力メニューで、例えば。


MA変数の変更に関するブロックです(コメント)

ピリオド MA

設定方法 MA

価格 MA

MACDの変数を変更するブロックです(コメント)

BBの変数を変更する際のブロックです(コメント)


以前は、このようなコメントをコードコメント機能で入力していたようです。つまり、//や/* */を書いたのですが、今ひとつうまくいきません。

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

このように

 
OrderStopLoss()の出力が小数点以下2桁なのですが、強制的に小数点以下3桁にすることはできますか?
 
Alekseu Fedotov:

こんな感じ。

ありがとう、思い出した!!!

 
Igor Golieniev:

こんな風に試してみてください。

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

これは、引用符の有効数字をすべて表示するためです。他の桁数が必要な場合は、Digits()を 特定の数字に置き換えてください。

 
こんばんは、何かヒントがあればお願いします。OnInit関数で2本の横線を 作成し、OnTick関数で2つの関数を作成します。1つはBidが1番目の線より大きい場合、2番目はBid < 2番目の線の場合にプッシュとメール通知を送信します。Bid=lineは、ギャップを避けるために、それをしませんでした。もちろん、条件を満たした場合、ティックするごとに通知が来るという悪条件にも直面しました。この問題を解決するにはどうすればいいのか。標準アラート設定にて、タイムアウトや通知回数を設定できます。
 
Ihor Herasko:

こんな風に試してみてください。

これは、引用符の有効数字をすべて表示するためです。それ以外の桁数が必要な場合は、Digits()を特定の数字に置き換えてください。

これで正しく15,155と表示されましたが、OrderModify関数では 無効なストップロスです。

この問題はOrderModifyのSilverでのみ発生します。

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Printで15,155と正しく表示されるようになりましたが、OrderModify関数では ストップロスが無効です。

この問題はOrderModifyのSilverでのみ発生します。

このコードには2つのエラーがあります。

  1. 最小許容ストップサイズ(Stop Levelと言います)のチェックが不足している。
  2. 実数の比較に誤りがある。

最初の問題を解決 するために、現在のストップ・レベルを取得する必要があります。

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

fStopLevelがゼロであることが判明し、口座タイプがECNでない場合、fStopLevelは3スプレッドに等しくなるように強制されるべきです。

ストップロスとテイクプロフィットの両方を設定する前に、新しいレベルが注文の終値からストップレベル以上であることを確認してください。買い注文のストップを確認するには、次のように行います。

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

売り注文のストップの場合。

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


第二の問題の解決 策:実数の等式はいつでもどこでも実現できるわけではないので、ある程度の精度で実数を比較すること。ストップレベル検証のコードで、すでに上記の比較の例を示しました。

 
Ihor Herasko:

このコードで印象的なのは2つのエラーです。

  1. 最小許容ストップサイズ(Stop Levelと呼ぶ)のチェックが不足している。
  2. 実数の比較に誤りがある。

最初の問題を解決 するために、現在のストップ・レベルを取得する必要があります。

fStopLevelがゼロであることが判明し、口座タイプがECNでない場合、fStopLevelは3スプレッドに等しくなるように強制されるべきです。

ストップロスとテイクプロフィットの両方を設定する前に、新しいレベルが注文の終値からストップレベル以上であることを確認してください。買い注文のストップを確認するには、次のように行います。

売り注文のストップの場合。


第二の問題の解決 策:実数の等式はいつでもどこでも実現できるわけではないので、ある程度の精度で実数を比較すること。すでに、ストップレベル検証のコードで、上記の比較例を示しました。

ありがとうございます。

しかし、疑問は尽きない。注文が開始されると、OrderModifyは直ちにトリガーを開始します。どこにエラーがあるのか?(繰り返しますが、すべての通貨/先物で機能しますが、シルバーでは機能しません)

 
Igor Golieniev:

ありがとうございます。

しかし、疑問は尽きない。注文が開始されると、OrderModifyは直ちにトリガーを開始します。どこにエラーがあるのか?(繰り返しますが、すべての通貨/先物で機能しますが、シルバーでは機能しません)

1.ディレクティブ

#property strict

をお使いですか?

2) 売りと買いのどちらで発生しますか、それとも売りだけで発生しますか?

3. ストップロスはポジションの開始 時に設定されるのですか、それとも可能であればトレーダーが設定すべきですか?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

ありがとうございます。

しかし、この問題は解決されたわけではありません。OrderModifyは、オーダーがオープンされると、すぐに動作を開始します。どこにエラーがあるのか?(繰り返しますが、すべての通貨/先物で機能します。銀では機能しません)

ログ スニペット(オンラインの場合、[Experts] タブ)を表示し、成行注文の開始と変更を確認し、どの TrailingStop および TrailingStep 値が使用されたかを示します。