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

 

ストップロスを正しく設定する最善の方法は、スプレッドについて正しく考えることです。スプレッドとは、売値と買値の間の距離のことです。そのため、Bid - SLを使用して買い注文に ストップロスを追加すると、自動的にスプレッドが含まれ、そのためのコードは必要なく、実質的にスプレッドを完全に無視することができるのです。売り注文の場合、Ask + SLを使用すると同じ効果があります。しかし、注意しなければならないのは、取引量が少ないときには、スプレッドが大きくなり、SLが期待する位置から大きく離れてしまう可能性があることです。

スプレッドの問題はさておき、エラー130の次の主な原因は、EAがまだ実行されている間に価格が変更されたことです。これは、EAの実行に時間がかかるか、サーバーが取引処理に非常に忙しく、EAの実行が遅れることによって起こります。その結果、あるティックが原因でEAが実行を開始したものの、実行が終了する前に別のティックが来てしまい、価格が無効になってしまったということです。

どちらの場合でも、RefreshRatesを使用して価格を更新する必要があります:while (RefrshRates() == 1) Sleep(5); ------ または待ち時間として必要なもの。

 
BigAl:


どちらの場合でも、RefreshRatesを使って価格を更新する必要があります:while (RefrshRates() == 1) Sleep(5); ------ あるいは、待ち時間として必要なもの。

これは、コードが事前定義された変数を使用している場合のみ正しいです。https://docs.mql4.com/predefined/variables コードがBidとAskにMarketInfoを使用している場合、RefreshRatesは何の関係もありません ... ...
 
qjol:
AFAIK RefreshRates()はエラー130とは関係ありません。

MODE_ASKなどを使えばRefreshRates()が不要になることには同意しますが、shinobiさんのコード例のように......と想定していました。

という注文を送ります。

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

で注文を出すと、定義済み変数ASKが使われているので、ask/bidやスプレッドの 値が変わって130というエラーになるのでは?そのような場合、OrderSend の直前に RefreshRates() を使用することができます。

 
BigAl:

MODE_ASKなどを使えばRefreshRates()が不要になるのは同意ですが、shinobiさんのコード例のように......と想定していました。

という注文を送ります。

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

で注文を出すと、定義済み変数ASKが使われているので、ask/bidやスプレッドの値が変わって130というエラーになるのでは?このような場合、OrderSend の直前に RefreshRates() を使用することができます。

皆さん、素晴らしいアドバイスをありがとうございました。
今はちょっと忙しいですが、機会があれば、皆さんの提案をすべて試して、同じ問題でこのスレッドにつまずくかもしれない人のために、まとめの書き込みをしたいと思います。

ありがとうございます、そしてお元気で

shinobi
 
BigAl: 例えば、次のような注文を出します。

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

は全てを語っているわけではありません。initial_stopはBidを使ってどのように計算しているのですか?

4/5桁のブローカーに 対応するため、SLIPPAGEをどのように計算するのですか?

 
やあ、みんな!

しばらくお休みしていました(新しい街への引っ越し、新しい仕事)。
でも今、このスレッドを取り上げて、この呪われた#130ストップロス・エラーの解決策をようやく見出したいと思います。

皆さんのアドバイスに感謝しつつ、全て取り入れてみました。

1:スプレッド

Bid-stoploss (Long) Ask+stoploss (Short)


2: Changing Market Rates
オーダー送信前にマーケットレートが変化する可能性を排除するために、 自分のコードを変更し、AskとBidを全て MarketInfo(Symbol(), MODE_ASK) と MarketInfo(Symbol(), MODE_BID)



3: 4-5 Digits-Broker
誤った桁数の原因として可能性を排除するために、WHRoedersコードに従ってストップロスを丸め
ました。

前述したように、私の場合、変数SLIPPAGEとTAKEPROFITは常に0です。ですから、これらも同様に問題を起こさないはずです。
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)

//init digit adjustment
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(Symbol(), OP_BUY, position_size, MarketInfo(Symbol(), MODE_ASK), SLIPPAGE, (MarketInfo(Symbol(), MODE_BID) - stoploss) * pips2dbl, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);


そこで、すべての提案を取り入れたのですが、エラーはまだ続いています。私が知る限りでは、以前と同じように頻繁に発生するので、他の原因があるはずです。 tickvalue: 12.50000000 pos size: 37.00000000 Ask/Bid 1262.00000000/1261.75000000 stoploss:12.59610000 position_size: 37 Spread 0.25000000 Error could not take long position.エラーは次のとおりです。エラーは#130










invalid stops

上記のOrderSendコードラインは、ロングポジションを取ろうとするためにログに記録された値で使用されました。 他に何か原因があるのでしょうか? ありがとうございます! shinobi
 

これは、ECNブローカーですか?

WHRoeder 2011.09.15 20:36

ECNブローカーでは、オープンしてからストップを設定する必要が あります。

 
shinobi:
桁数が無効である可能性を排除するために、WHRoedersのコードに従ってストップロスを丸めた。
  1. 私が投稿したコードには丸めがありませんでした。
  2. ECNブローカーでは、オープンしてからストップを設定する必要があります。
  3. 金属(TICKSIZE != Point)では、保留中の注文の開始 価格は丸められなければなりません
    double TS=MarketInfo(pair, MODE_TICKSIZE);
    OOP = MathRound(OOP/TS)*TS;
    ストップについては
    わかりません。
  4. 値がどうとか、自分がやったと思ってることを言うのはやめてくれ。コードを貼ってくれ
 

ただ、次のようにします。

extern double StopLoss = 50;

extern double TakeProfit = 50;

とすると、買いの場合は

ダブルSL=Bid - StopLoss*Point;

ダブルTP=Bid + TakeProfit*Point;

int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,"",12345);

if( Ticket<0) print("エラー="GetLastError());

売りの場合

ダブルSL=Ask + StopLoss*Point;

ダブルTP=Ask - TakeProfit* Point;

int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,"",12345);

if( Ticket<0) print("error="GetLastError());

で、うまくいかない場合はログファイルを投稿してください。

 
Raptorさん、WHRoederさん、SDCさん、お返事ありがとうございました。

SDCです。
あなたのコードをこのように試してみました。
   int result_ticket = -1;
   double stoploss            = 50;
   double takeprofit          = 50;
   double SL = 0.0;
   double TP = 0.0;
   if(long) {   //take long position
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, SL, TP, "", 12345);
   } else {     //take short position
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, SL, TP, "", 12345);
   }

   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
唯一の違いは、RaptorとBigAIが言及したRefreshRatesの問題を避けるために、Point, Ask, BidをMarketInfoで置き換えたことです。
この単純な例では、問題はまだ残っています。まだ、次のように表示されます。

#ESZ1,M5:オープニングポジション
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: ポジションサイズ: 1.00000000
#ESZ1,M5:アスク/ビッド1244.50000000/1244.25000000
#ESZ1,M5:スプレッド0.25000000
#ESZ1,M5:スレッド:1244.00000000
#ESZ1,M5:TP:1245.00000000
#ESZ1,M5:エラー=130

ラプターです。
私は現在、UWC-Traderをテスト用のデモ口座 で使用しています。
先に述べたように、私は先物を取引しています。例えば、ESZ1やFDXZ1などです。

WHRoeder。
申し訳ありませんが、私も丸めません。round "を "adjust for 4/5-Digit Brokers "に置き換えてください。I.E. 私はあなたのコードを適用しただけです。
前の返信で使っているのと同じようにOrderSendも掲載しました。そして、関係するすべての変数の値。コードの他の部分はよく分かりませんが、興味深いです。
SDCが提案したミニ例が示すように、エラーはこの単純なコードに分解することができます。ということは、もっと根本的なところにあるのでしょう。

私は金属を取引していないので、四捨五入は重要ではないはずです。

次に試してみます。
オープニング(ストップロスなし)、そして後で修正(ストップロスの設定)。

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

shinobi