そこで、すべての提案を取り入れたのですが、エラーはまだ続いています。私が知る限りでは、以前と同じように頻繁に発生するので、他の原因があるはずです。 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
ストップロスを正しく設定する最善の方法は、スプレッドについて正しく考えることです。スプレッドとは、売値と買値の間の距離のことです。そのため、Bid - SLを使用して買い注文に ストップロスを追加すると、自動的にスプレッドが含まれ、そのためのコードは必要なく、実質的にスプレッドを完全に無視することができるのです。売り注文の場合、Ask + SLを使用すると同じ効果があります。しかし、注意しなければならないのは、取引量が少ないときには、スプレッドが大きくなり、SLが期待する位置から大きく離れてしまう可能性があることです。
スプレッドの問題はさておき、エラー130の次の主な原因は、EAがまだ実行されている間に価格が変更されたことです。これは、EAの実行に時間がかかるか、サーバーが取引処理に非常に忙しく、EAの実行が遅れることによって起こります。その結果、あるティックが原因でEAが実行を開始したものの、実行が終了する前に別のティックが来てしまい、価格が無効になってしまったということです。
どちらの場合でも、RefreshRatesを使用して価格を更新する必要があります:while (RefrshRates() == 1) Sleep(5); ------ または待ち時間として必要なもの。
どちらの場合でも、RefreshRatesを使って価格を更新する必要があります:while (RefrshRates() == 1) Sleep(5); ------ あるいは、待ち時間として必要なもの。
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() を使用することができます。
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
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:スプレッド
2: Changing Market Rates
3: 4-5 Digits-Broker
ました。
invalid stops
上記のOrderSendコードラインは、ロングポジションを取ろうとするためにログに記録された値で使用されました。 他に何か原因があるのでしょうか? ありがとうございます! shinobi
これは、ECNブローカーですか?
ECNブローカーでは、オープンしてからストップを設定する必要が あります。
桁数が無効である可能性を排除するために、WHRoedersのコードに従ってストップロスを丸めた。
ただ、次のようにします。
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());
で、うまくいかない場合はログファイルを投稿してください。
SDCです。
あなたのコードをこのように試してみました。
唯一の違いは、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