[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 793

 
artmedia70:
Ask価格でBuyを開くのではないのですか? 。


そう書きました。"買い注文は Ask価格で開く"。

しかし、チャート上ではBid価格が表示されています。

 
PapaYozh:


そう書きました。"買い注文はAsk価格で開く"。

しかし、チャート上ではBid価格が表示されています。

私はいつも両方の価格をチャートに表示しているのですが...。端末の 設定でF8でAsk`の価格表示を有効にしたのですが・・・。また、前回の投稿でスプレッドについて少し訂正しましたが、そのようなことはありえません。
 
artmedia70:
アスクでバイを開けないの?そして、60pipsのスプレッドはありえないし(ギャップ後に取る場合)、その前に取るなら・・・EURの325pipsのスプレッドは等しいです。:)

あなたの写真にはポイントが表示されていません。
 
PapaYozh:

あなたの写真では、ポイントが見えませんね。
はい、悔い改めます.というのは、誤解を招きかねないからです(例えば、あなたの投稿の括弧は、asksについてのあなたの回答の意味を失わせ、間違った回答をさせてしまいました...)。:))
 
artmedia70:
私はいつも両方の価格をチャートに表示しているのですが...。端末の設定で、F8でAsk`tsの表示を有効にしたのですが・・・。そして、スプレッドについて少し前の投稿を修正しました - それはできません。 。


しかし、Askの価格はバーに表示されていません。

広がりについて5桁の スプレッドなのか?もしそうなら、ニュースでのスプレッド拡大+スリッページ=6フル(60の5桁)ピップスです。

 
PapaYozh:


しかし、Askの価格はバーに表示されていません。

広がりについて5桁のスプレッドなのか?もしそうなら、ニュースの拡張スプレッド+スリッページ=6フル(60の5桁)ピップスです。

それが、4-...:(
 
PapaYozh:

私があなたの問題を正しく理解していれば、注文の終了時刻に誘導されることはないはずです。オープンシグナルが発生し、ポジションがオープンされたバーの先頭から開始する必要があります。私ならどうするか、個人的には次のように考えます。

1) datetime型の変数を作成し、注文が成功した場合にTime[0]という値を入力します。

2) init()関数で、この変数を値「0」で初期化する。 コードをレビューするときに、より明確なので、私は明示的に初期化することを好みます。

3) ポジションを開く条件が揃ったら、OrderSend(...)リクエストを送る前に、この変数の値とTime[0]を比較し、等しくない場合はリクエストを送る。

4) もしポジションがオープンしたら、同じ変数にTime[0]の値を格納します。


しかし、Time[0]の値と比較する代わりに、OrderSend(...)リクエストの前にこのタスクを与えてみてください:現在のバーでStopLoss-yのクローズがあるかどうかをチェックしてください?それから、私は発表したStopLoss変数で動作するduble StopLoss()関数を入力する必要がありますか?それとも、原則的に不可能なのでしょうか?損切りをしたバーでは、たとえオープニングのパラメーターと合致しても、新しいポジションを開かないことが重要だと思います。

extern double Stoploss           =1000;
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
    
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,30,Bid+Stoploss*Point,Bid-Takeprofit*Point,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask-Stoploss*Point,Ask+Takeprofit*Point,"",MAGICMA,0,Blue);
      return;
     }
//----
  }

問題は、タイミング的な要素は最後に考えるべきで--非常によく滑る--というか、命令の解釈がなぜか違う(あいまいな)ことが判明することです。

 
obla4koさん、 datetime変数xを作成し、ストップロスが発生したバーの開始時刻とします。また、オープンコンディションでは、(Time[0]!=x)と設定します。この場合、xは新たにトリガーされたストップループで更新されるはずです。これが最初のバリエーションです。そして2つ目は、私が3回目に書いているように、1バーを待ってトリガー停止スイッチの後、これは正確に同じであろう、それは論理的ではありませんか?
 
PapaYozh:


しかし、Askの価格はバーに表示されていません。

広がりについて5桁のスプレッドなのか?もしそうなら、ニュースで広がったスプレッド+スリッページ=6フル(60の5桁)ピップスです。

また、私の意見では、その後クリーンアップ:))、しかし、あなたが取得しない小さい時間枠の "メモリに保存"、 "ヘアピン "があるかもしれません...。

そして、履歴に関するテストについての質問:

は、Expert Advisor(簡単なものです!)を使用することができます。- ...)が、同じ時代、同じパラメータで、全く違う結果を出すでしょうか?

この2つのテストの間に私がしたことは、引用符のアーカイブを更新したことだけです...。と、そのような結果になったのでは!?- ということは、全部デタラメだったということか!?

 

なぜMathRound()の挙動がおかしいのか、誰か教えてください。大きな値でカウントし、小さな値ではカウントしない...。

ある変数の値を10%増加させる簡単なコードがあります。

if (IncreaseTP) 
   {
      LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr);  // PercentTakePr = 10; (десять процентов) эту строку считает
      TStartS = MathRound(TStartS+TStartS/10*PercentTakePr);                          // а вот эту и все, которые ниже - нет
      TStop.Sell = MathRound(TStop.Sell+TStop.Sell/10*PercentTakePr);                 // ... причём, если деление на 100 заменить на деление на 10,
      TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/10*PercentTakePr);     // ... то начинает считать и эти строки, но уже, естественно...
      if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread;               // ... рассчёт становится неверным...
   }

算出された値はログに記録されます。1行目以外を10で割った場合、この1行は100番とカウントされ、問題はない。

2010.08.11 19:16:20 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: 計算機能SL=11、TP=66TStartS=60、TStop.Sell=20、TStopLastPosS=60、 TStop.SellLP=25

緑色で表示されているのは、コードの最初の行でカウントされるものです。

しかし、100で除算をかけると、(本来であれば)

if (IncreaseTP) 
   {
      LastTakeProfitS = MathRound(LastTakeProfitS+LastTakeProfitS/100*PercentTakePr);  // PercentTakePr = 10; (десять процентов) эту строку считает
      TStartS = MathRound(TStartS+TStartS/100*PercentTakePr);                          // а вот эту и все, которые ниже - нет
      TStop.Sell = MathRound(TStop.Sell+TStop.Sell/10 0*PercentTakePr);                 // ... причём, если деление на 100 заменить на деление на 10,
      TStartLastPosS = MathRound(TStartLastPosS+TStartLastPosS/100*PercentTakePr);     // ... то начинает считать и эти строки, но уже, естественно...
      if (TStop.SellLP<=Level_new+spread) TStop.SellLP=Level_new+spread;               // ... рассчёт становится неверным...
   }

...とすると、一番上の行を除くすべての行がカウントされず、まるで追加されていないかのように、初期値が残ります。

10%です。

2010.08.11 19:41:03 2009.01.02 10:34 Sergitas_v1.01 EURUSD,M5: 計算機能:SL = 11 and TP = 66,TStartS = 30, TStop.Sell = 10, TStopLastPosS = 30, TStop.SellLP = 15

何がどこにあるか分かるように助けてください...です。:)


理由: