エラー#130 invalid stoplossに関するヘルプが必要です。

 
フォーラムの皆様へ。

フォーラムでは、多くの方がこのエラーに悩まされているようですね。
私が他のスレッドで理解したように、このエラーの原因は以下の通りです。
a: ストップロスの値が現在の価格に近すぎる。
b: 0の後の桁 数が間違っている

aについて。
私が理解したところではMarketInfo(Symbol(), MODE_STOPLEVEL))は、ストップロスが持つべき最小距離を教えてくれるはずです。
では、失敗したトレードの例です。

Marekt Info:
日付: 2011/9/15 16:31
シンボル#ESU1
ストップレベル: 75.00000000
ポイント: 0.01000000
ティックサイズ: 0.25000000
ティック値: 12.50000000
桁数: 2.00000000

したがって、最短距離はストップレベル*ポイントになりますね。
というわけで、私の失敗した注文はこちらです。
2011.09.15 16:32:07 '393930': 注文売り 18.00 #ESU1 1201.00で開く sl: 1202.35 tp: 0.00 failed [Invalid S/L or T/P] 失敗したのは、S/LまたはT/Pです。
エラーは:130 / 無効なストップ

stoplossはopeningから1.35離れている。だから大丈夫なはずです。桁の(b)も合っています。
なのに、なぜこのようなエラーが出るのでしょうか?

また、このエラーはなかなか再現性がありません。出るときもある。出ないときもある。
何度も続けて表示されることもあります。

何かいいアイデアはありませんか?
よろしくお願いします。

 
このエラーが発生した正確な時刻のスプレッドはどうなっていたのでしょうか?
 

コード内でエラーケースを作り、RefreshRates()を使用することができます。

すぐにどうすればいいかわからないけど、たぶんこんな感じ。

if(Trade==fase)

{

int ErrorCode= GetLastError();

if (ErrorCode=130)

{

RefreshRates()を実行します。

}

}

このコードは正しくないかもしれないので、ググってみてください。

また、もしまだならNormalizeDouble関数で 数値を丸めてください。

 
35806:

コード内でエラーケースを作成し、RefreshRates()を使用することができます。

これはどのように役立つのでしょうか?
 
RaptorUK:
それでどうなるのでしょうか?

大文字と小文字の区別があるので、料金を更新すると直る可能性があるとのことです。
 
35806:

大文字と小文字の区別があるので、料金を更新すれば直るかもしれないとのことでした。
コードを見たことがありません。もし、定義済みの変数を使用していないのなら、いくらRefreshRatesを使用しても解決しません。
 

を真に受ける。

 
ご感想ありがとうございます。

Raptorさん、上のトレードのスプレッドはわかりません。コード内にログ出力を追加しましたので、次回エラーが発生した際にはスプレッドをお伝えできると思います。
しかし、なぜスプレッドが重要な のか、教えていただけませんか?ストップロスを決定する際に、どのようにスプレッドを考慮する必要があるのでしょうか?


int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

したがって、注文を送るときに使う定義済みの変数はこれだけです。

EXPERT_ID はユニークなマジックナンバー
position_size は整数で、例えば3
initial_stop は私のストップロスで、(上記の例の場合)Bid - risk です。
リスクは(MODE_STOPLEVEL * Point)より大きい値で、最初の投稿のトレードの場合です。リスクは次の通りでした: 1.35
 
shinobi:
ご感想ありがとうございました。

Raptorさん、上のトレードのスプレッドはわかりません。コードにログ出力を追加しましたので、次回エラーが発生した時にはスプレッドをお伝えできると思います。
しかし、なぜスプレッドが重要なのか、教えていただけませんか?ストップロスを決定する際に、どのようにスプレッドを考慮する必要があるのでしょうか?


今後のために プリントをログに追加するのはよくやったよ :-)

私はいつもSpreadを考慮しなければならないところとそうでないところをじっくり考えなければなりません。 私はそれが関係するところでメンタルブロックを持っているようです......しかし、私はこれが正しいと思います。

買いの場合、それは問題ではなく、Askで買い、SLはBidで起こるので、SpreadはすでにOpenPriceに織り込まれているはずです。 売りは違う問題で、Bidで売るとSLはAskの価格で行われます。 私はこれが正しいと思います、それについて考え、それが意味をなすかどうか見てください.もし間違っていたら、訂正してもらえると嬉しいです.)

 
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
EAは、4/5桁のブローカー、TP、SL、およびスリッページを調整する必要があります。ECNブローカーでは、オープンしてからストップを設定する必要があります。
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
     if (Digits % 2 == 1){      // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//---- These are adjusted for 5 digit brokers.
    /* On ECN brokers you must open first and THEN set stops
    int ticket = OrderSend(...)
    if (ticket < 0)
       Alert("OrderSend failed: ", GetLastError());
    else if (!OrderSelect(ticket, SELECT_BY_POS))
       Alert("OrderSelect failed: ", GetLastError());
    else if (!OrderModify(OrderTicket()...)
       Alert("OrderModify failed: ", GetLastError());
     */
 
35806:

大文字と小文字の区別があるので、料金を更新すると直る可能性があるとのことでした。
AFAIK RefreshRates()はエラー130とは 関係ありません。