初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 19

 
Vitalie Postolache:
そんなことないですよ ))))
理由はmql4ではない
 
Vitalie Postolache:

そういうことはあまりないですね。この関数の引数は、1)検索する文字列、2)検索する文字の組み合わせ、3)検索の開始点(デフォルトでは、手順1の文字列のヌル文字から)である。

文字列の何番目の位置から部分文字列が始まるかを返し、部分文字列が見つからなければ -1 を返す。

だから、こう書くべきなのだ。

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

回答ありがとうございました・・・。そこで、StringFind 関数にパラメータ( string_value, string match_substring, int start_pos=0 )を付けて、コモンコードに1行で記述 します。

関数パラメータのデータに対応する引数: string OrderComment(), string "[tp]", int 0 そしてこの式(中括弧で 囲まれた)が-1より 大きい場合、以下の {括弧}のコードが 実行 されます。

if(StringFind(OrderComment(),"[tp]",0)>-1) とする。

{

double OrderTakeProfit()です。

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("注文番号",OrderTicket()," 利益: ", OrderTakeProfit());

さもなくば

Print("OrderSelect() "はエラー",GetLastError() を返しました);

bool PlaySound()

string payment //"payment "MT4サウンドフォルダ内のファイル名 です。

);

}

...このコードはMQL4で動作しますか? ...

 
bablusut:

返信ありがとうございました.StringFind 関数のパラメータ( string_value, string match_substring, int start_pos=0)は、 一般的なコードでは、次のように1行で記述 することが判明しています。

関数パラメータのデータに対応する引数: string OrderComment(), string "[tp]", int 0 そしてこの式(中括弧で 囲まれた)が-1より 大きい場合、次の {括弧で囲まれた}コードが 実行 されます。

if(StringFind(OrderComment(),"[tp]",0)>-1) とする。

{

double OrderTakeProfit()。

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("注文番号",OrderTicket()," 利益: ", OrderTakeProfit());

さもなくば

Print("OrderSelect() "はエラー",GetLastError() を返しました);

bool PlaySound()

string payment //"payment "MT4サウンドフォルダ内のファイル名 です。

);

}

...このコードはMQL4で動作しますか? ...

double OrderTakeProfit(); - コンパイル時にエラーになるはずです。

私が理解している範囲では(私自身もまだ勉強中ですが)、OrderTakeProfit();はマーケットに注文の利益を要求 します。したがって、Expert Advisorは、これらの数行のために2つの要求を行います。 OrderTakeProfit(); この行は削除する必要があるように見えます (double OrderTakeProfit(); )

 
bablusut:

返信ありがとうございました.StringFind 関数のパラメータ( string_value, string match_substring, int start_pos=0)は、 一般的なコードでは、次のように1行で記述 することが判明しています。

関数パラメータのデータに対応する引数: string OrderComment(), string "[tp]", int 0 そしてこの式(中括弧で 囲まれた)が-1より 大きい場合、以下の {括弧で囲まれた}コードが 実行 されます。

if(StringFind(OrderComment(),"[tp]",0)>-1) とする。

{

double OrderTakeProfit()。

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("注文番号",OrderTicket()," 利益: ", OrderTakeProfit());

さもなくば

Print("OrderSelect() "はエラー",GetLastError())を返しました。

bool PlaySound()

string payment //"payment "MT4サウンドフォルダ内のファイル名 です。

);

}

...このコードはMQL4で動作しますか? ...

これはすでに言及されています:ダブルOrderTakeProfit()- それをしないでください。この関数は自動的に宣言されるので、再宣言する必要はありません。 標準的な関数は事前に宣言する必要がないため、コンパイラはエラーを発生させます。

if(OrderSelect(12, SELECT_BY_POS)==true)- そうすると、せいぜいこれは別の注文になり、上記のコメントが処理されたものにはならない。順序はif(StringFind(OrderComment(),"[tp]",0)>-1) の前にすでに一番最初に選択されていなければならず、ループカウンタは定数ではなく順序番号の引数として使用しなければならず、さもなければ繰り返し毎に12番目の順序がチェック されることになります。

 
Vitalie Postolache:

彼らはすでにそれについて言っている:ダブルOrderTakeProfit()- それをしないでください。この関数は自動的に宣言されるので、繰り返し宣言してはいけません。 標準的な関数はあらかじめ宣言する必要がないため、コンパイラはエラーを発生します。

if(OrderSelect(12, SELECT_BY_POS)==true)- そうすると、せいぜいこれは別の注文であって、上記のコメントが処理されたものではなくなりますね。注文はすでに一番最初に選択されている必要があり、その前にif(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit です。

double OrderTakeProfit(); - コンパイル時にここでクラッシュするものと思われます。

私が理解する限り(私自身もまだ理解しています)、OrderTakeProfit();は、マーケットに対して注文の利益要求を 行います。したがって、Expert Advisorは、これらの数行のために2つの要求を行います。 OrderTakeProfit(); この行は削除する必要があるように見えます (double OrderTakeProfit(); )

コメントありがとうございます。
 
"Vitalie Postolache:

彼らはすでにそれについて言っている:ダブルOrderTakeProfit()- それをしないでください。この関数は自動的に宣言されるので、繰り返し宣言してはいけません。 標準的な関数はあらかじめ宣言する必要がないため、コンパイラはエラーを発生します。

if(OrderSelect(12, SELECT_BY_POS)==true)- そうすると、せいぜいこれは別の注文になり、上記のコメントが処理されたものにはならない。また、ループカウンターは定数ではなく、オーダー番号の引数として設定する必要があり、そうしないと、繰り返し実行するたびに12番目のオーダーが表示 されることになります。

返信ありがとうございました.関数double OrderTakeProfit() の宣言は理解できるので、削除してしまいましょう。

"前のコードでループカウンターが1つしかない場合、OrdersHistoryTotal関数で、 本体(i=0;i<accTotal;i++)を 持つ loop for 演算子を注文番号の引数に する必要があり、これは、演算子の本体をOrderselect 関数本体で 置き換える必要があり 我々はそれを取得することを意味します。

if(StringFind(OrderComment(),"[tp]",0)>-1) とする。

{

if(OrderSelect(i=0;i<accTotal;i++)==true)

Print("注文番号",OrderTicket()," 利益: ", OrderTakeProfit());

さもなくば

Print("OrderSelect() "はエラー",GetLastError())を返しました。

bool PlaySound()

string payment //"payment "MT4サウンドフォルダ内のファイル名 です。

);

}

...このコードはMQL4で動作しますか? ...




 
bablusut:

返信ありがとうございました.関数double OrderTakeProfit() の宣言は明確なので、削除してしまいましょう。

"ループカウンターを注文番号の引数として使用すること" - 前のコードでは、ループカウンターは1つだけで、OrdersHistoryTotal関数内の ループ for 演算子の本体(i=0;i<accTotal;i++)にあります、 それは、演算子の本体をOrderSelect 関数の本体 と置き換えれば、それを得ることができるということです。

もう一度。オーダーを使った作業では、まず オーダーセレクトでなければなりません。そして、その他もろもろ。

順番にループで作業する場合、以下のような順序になります。

1.チェック if(OrderSelect())

2.正しい注文かどうかを確認するため、通常はシンボルとマジックナンバーを確認し、次にタイプを確認します if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - この場合、現在のシンボルで指定されたマジックナンバーの成行き注文のみが処理されます。

OrderComment()、OrderProfit()などの他のデータの処理。

以下のような感じになります。

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
iCustomインジケーターの 片方のバッファにシグナル値があるかどうかを確認するにはどうすればよいですか?
 
Vitalie Postolache:
もう一度言います。OrderSelectは、オーダーを操作するときに最初に 表示されるべきものです。それから、他のすべて。

試行錯誤して決めたらしいが、高い、自分もそうだった...。

正直、耳鳴りがします...。

 
atik441:
iCustomのインジケーターバッファに シグナル値があるかどうか、どのように確認するのですか?
リンクをたどると、あなたの投稿にハイライトされています。