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

 
Fox_RM:
こんにちは。
ある(ユーザーが定義した)数の注文を開く際に問題が発生しました。
この問題を解決するために、小さなコードを書きました。
しかし、テストの終了間際になると、任意の数のオーダーが開かれることがある。

以下は、コードそのものです。

もっとシンプルな解決策があれば、コメントをいただければと思います。


この方がいいかもしれません。

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
ありがとうございます。しかし、私にとっては少し複雑で、あなたの関数は一度に4つのメッセージを出力しますが、私は1つのメッセージを必要とします。1行に64文字以内であることが判明?

いいえ、長いメッセージを、画面で読める範囲で、4つ以下に分割するのです。各パーツが64文字以内であることが主な条件です。メッセージが短い場合、1つのパートで関数に渡すことができます。

ほら、この機能を試すために、トレーラーにチップスターを取り付けたんだ。テスターでビジュアルモードで実行し、ビジュアルチャートにWin_Informインジケータを置く(それはトレーラーで私の前のメッセージにあります)。この機能がどのようなものか、すぐにおわかりいただけると思います。

ファイル:
 
r772ra:


そのほうがいいかもしれませんね。

これは、私がアップグレードを開始する際に使用したコードについてです。あなたのバージョンには、3つの問題があります。

-OP_BUYと OP_SELLの 注文を出すと同時に、OrdBと OrdSの パラメータが1ティック ごとに自動的に増えていくので、該当ティックの変化(売りか買いか)だけを再計算条件として追加 したのです。

- すべてのオーダーを再計算するとOrdBと Ordの 誤差が生じるので、最後のオーダーの変更だけを考慮 すればよい。

- あなたのバージョンでは もし (OrdB<=OrederBuy),if(OrdS<=OrederSell) の注文をさらに開くための パラメータOrdB と Ord 減少がない のです。

という感じですね。

 
Fox_RM:

私はこのコードくらいからバージョンアップを始めました。あなたのバージョンには、3つの問題があります。

-OP_BUYと OP_SELLの 注文を出すと同時に、OrdBと OrdSの パラメータが各ティックで自動的に増加するので、該当ティックの変化(売りか買いか)のみで再計算条件を追加 したのです。

- すべてのオーダーを再計算するとOrdBと Ordの 誤差が生じるので、最後のオーダーの変更だけを考慮 すればよい。

- あなたのバージョンでは もし (OrdB<=OrederBuy),if(OrdS<=OrederSell) の注文をさらに開くための パラメータOrdB と Ord 減少がない のです。

同じようです。

そう、forループの前に注文のカウンターをゼロにする必要があるのです。

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

こんにちは!キムさんからの機能を理解するために、ご協力お願いします。

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

セリフがわからない

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

なぜ最初のifの後に記号がないのか、式をこう書くとどうなるのか。StringFindは 何をするのか、なぜJPYで文字列を検索するのか?d=0はどのようにしてできるのか、どのような場合に2が割り当てられ、どのような場合に4が割り当てられるのか。回答していただけると大変ありがたいです、よろしくお願いします)))

 
r772ra:

その通り、forループの前に、オーダーカウンターをゼロにリセットする必要があります

))なぜか自分では思いつかず、あたふたし始めた。
 
Fox_RM:
))なぜか自分では思いつかず、風を受け始めてしまったのです。

厄介払いができた。
 
Lisi4ka330: なぜ最初のifの後に記号がないのか、もしこのような式を書いたらどうなるのか...。d=0はどのようにしてできるのか、どのような場合に2が割り当てられ、どのような場合に4が割り当てられるのか。ご回答いただけると幸いです、よろしくお願いします)))

この方がより理にかなっていると思います。

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - 見積もり精度(小数点以下の桁数).

JPYのペアがある場合、メジャーのレートはxxx.xxです。

ペアにJPYがない場合、メジャーのレートはx.xxxxとなります(「4桁」の名の由来)。

 
r772ra:

そうですね、forループの前に、オーダーカウンターをゼロにリセットする必要がありますね。


もう一点、見落としていました。

- あなたのバージョンでは if (OrdB<=OrederBuy),if(OrdS<=OrederSell) の注文をさらに開くための パラメータOrdB と OrdS 減少がありません

新しいバージョンでは、例えば5つの注文を出し、再計算しましたが、if条件でそれ以上注文を出すことができません。私の古いバリアントでは、OrdB--と OrdS--。

が使用されました。

 
GaryKa:

この方がより理にかなっていると思います。

d - 見積もり精度(小数点以下の桁数).

JPYのペアがある場合、メジャーのレートはxxx.xxです。

日本円がない場合、メジャーレートは約x.xxxx(4桁)となります。

GaryKa さん、回答ありがとうございます!dが0になるのはちょっと不明ですが、関数
 d=MarketInfo(sy, MODE_DIGITS)
は小数点以下の桁数を返すので、d は常に 0 より大きくなり、条件は常に偽となります。