EAにMaxTradesPerBarを追加する際のヘルプ - ページ 2

 
serpentsnoir:

megamixxです。

もしあなたがまだそこにいるならば、私はあなたが探しているものを行うためにいくつかのコードの変更を提案することができます。もしまだご興味がおありでしたら、ご連絡ください。

その後、再コンパイルして、エラーなしになることを確認してください。これができたら教えてください、私は次の変更を貼り付けます。

それを取得し、正常にコンパイルありがとうsn。
 
megamixx:

ゲットして無事コンパイルできましたsnさんありがとうございます。


OK、よかった。

次に、次のようなコードのブロックがあります。

int openPositions()
{
//... blah...
}

ブロック全体をコピーし、直後に貼り付けて、OpenTradesOnThisCandleに名前を変更します。

そして、リコンパイルして、エラーなしになることを確認します。

これから仕事に行くので、私からの連絡は遅くなると思います。 行き詰まったら変更点を投稿してください。

 

このブロックをコピーして名前を変え、今は以下のようになっています。

int OpenTradesOnThisCandle( )
{ int op =0;
for(int i=OrdersTotal()-1;i>=0;i--)// すべての注文とポジションをスキャン...
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol() ==Symbol() )
{
if ( OrderType() == OP_BUY ) op++;
if ( OrderType() == OP_SELL ) op++;
}.
}
return(op);
}.

正しくできているといいのですが......。コンパイルしてみたところ、エラーは出なかったのですが、警告が出ました。

関数"OpenTradesOnThisCandle" is not referenced and will be removed from exp-file
0 エラー(s), 1 警告(s)

 

よかった。このメッセージは単なる警告で、すぐに消えます。

次に、作成した新しいサブルーチンの MODE_TRADES と表示されている行を MODE_HISTORY に変更します。

次に、OrderType()の2つのif文の両方を次のように置き換えてください。

if (OrderOpenTime() > Time[0]) op++;

これができたら(同じ警告が出ますが)、コンパイルして、エラーがないことを確認してください。

 
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol()==Symbol() )
  1. 関数の戻り値とは何ですか?どのように使用するのですか?- MQL4フォーラム
  2. ループ内にサーバーコールがある場合、 カウントダウンして 戻り値を確認する必要があります ループと注文のクローズまたは削除 - MQL4 forum
 

現在、ブロックはこのようになっています。

int OpenTradesOnThisCandle( )
{ int op =0;
for(int i=OrdersTotal()-1;i>=0;i--) // すべての注文とポジションをスキャン...
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderMagicNumber() != MagicNumber) continue;
if ( OrderSymbol()==Symbol() )
{
if (OrderOpenTime() > Time[0]) op++;
if (OrderOpenTime() > Time[0]) op++;
}

return(op);
}

コンパイル済み、エラー0件、警告1件

 

megamixさん、こんにちは。

私はこのスレッドを最初から読んでいるわけではありませんが.

1.コードを投稿するときにSRCボタンを使用する

2.OrderSelect()の戻り値はtrueかfalseなので、これが正しいOrderSelect()の書き方です。

int OpenTradesOnThisCandle( )
  { 
  int op =0;
  for(int i = OrdersTotal() - 1;i >= 0; i-- ) // scan all orders and positions...
    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == true   // if order select is true ...
        && OrderMagicNumber() != MagicNumber                  // ... and magic number is our magic number ...
        && OrderSymbol()      == Symbol() )                   // ... and symbol is chart symbol
        { 
        if (OrderOpenTime() > Time[0]) op++;             
        if (OrderOpenTime() > Time[0]) op++; 
        }
    } 
    return(op);
  }

:D

 
onewithzachy:

megamixさん、こんにちは。

私はこのスレッドを最初から読んでいるわけではありませんが.

1.コードを投稿するときにSRCボタンを使用する

2.OrderSelect()の戻り値はtrueかfalseなので、これが正しいOrderSelect()の書き方です。

:D


コード投稿のヒントありがとうございます。理解できました。2.については、snが手順を教えてくれているので、彼のプロセスを台無しにしたくないので、snに譲ることにします。とても感謝しています。

 
megamixx:


コード投稿のヒントありがとうございます。理解できました。2.については、snが手順を教えてくれているので、彼のプロセスを台無しにしたくないので、snに譲ることにします。ありがとうございます。


onewithzackyの言うとおり、リターンコードをチェック するのは良い習慣です。

if (OrderOpenTime() > Time[0]) op++; <<== これは一度だけ存在する必要があります。だから1回だけ取り出す。

次にやるべきことは、このコードを見つけて、すぐ下に複製することです。

     if(TradesInThisSymbol > 0) 
     {
      return(0);
     }

そして、次のように変更します。

(TradesInThisSymbol > 0) を

(OpenTradesOnThisCandle() > MaxTradesPerCandle)
に変更します。

それからコンパイルすると、エラーは解消されるはずです。

 
serpentsnoir:


onewithzackyさんのおっしゃる通り、リターンコードをチェックするのは良い習慣ですね。

if (OrderOpenTime() > Time[0]) op++; <<== これは一度だけ必要です。 だから1回だけ取り出す。

次に、このコードを見つけて、すぐ下に複製します。

そして、次のように変更します。

(TradesInThisSymbol > 0) に変更します。

に変更します。

(OpenTradesOnThisCandle() > MaxTradesPerCandle) です。

それからコンパイルしてください。


完了しました。

重複を削除 if (OrderOpenTime() > Time[0]) op++;

を発見し、変更

(TradesInThisSymbol > 0)を

(OpenTradesOnThisCandle() > MaxTradesPerCandle)に変更しました。

この件では、親切なご助言をいただき、ありがとうございました。