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

削除済み  
同じ問題です。注文は、stoploss = 0 と takeprofit = 0 でうまく開きます。
しかし、その後OrderModifyが失敗します。

以下のコードは、前回の投稿から上のコードの後に実行されています。

   bool modify = false;
   entry_price = OrderOpenPrice();
   if(long) {  
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Red);  
   } else {    
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Green); 
   }
   Log("[5] SL: " + SL);
   Log("[5] TP: " + TP);
   
   if(!modify) {
      Log("error="+GetLastError());
      return(-1);
   }

Log ist:

#ESZ1,M5:オープニングポジション
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5:ポジションサイズ:1.00000000
#ESZ1,M5:アスク/ビッド 1242.00000000/1241.75000000
#ESZ1,M5:スプレッド 0.25000000
#ESZ1,M5: オープン #13679252 買い1.00 #ESZ1 1242.00でOK
#ESZ1,M5: 注文 13679252 成功裡にオープン
#esz1,m5: sl: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5:エラー=130

というわけで、最初にオープンしてストップロスを設定してもうまくいかないようです :-/。
 

スプレッドは0.25

#ESZ1,M5:スプレッド0.25000000

OK、あなたは...1242.00Ask)で買いを建てます。

#ESZ1,M5: オープン #13679252 買い1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5: 注文 13679252 成功裏にオープン

次に、TPを買値 + 2 * スプレッド、SLを の買値 - 2 * スプレッドで変更しようとします。

#esz1,m5: SL: 1241.25000000

#esz1,m5: tp: 1242.25000000

もしFreezeLevelが0.50なら、それはあなたの問題です...あなたのFreezeLevelは何ですか?

 
shinobi:
同じ問題。注文は、stoploss = 0 と takeprofit = 0 でうまく開きます。
しかし、その後OrderModifyは失敗します。

4桁、5桁のブローカーに対応していない。最初に開いてからストップを設定しない。

以前回答した ように

 

そうですね、おそらくECNブローカーで取引されていると思いますが、ゼロストップで注文をオープンし、オープン後に注文を修正しなければならないので、50pipsのSLとTPの問題があります、Raptorが言ったように念のためfreezelevelとstoplevelもチェックしてみてください

OrderModify()のコードもチェックしてみてください・・・多分そのように動作すると思いますが、OrderSelect()で 注文を選択してからOrderOpenPrice()を実行した方が良いと思います。

削除済み  
本当にありがとうございました。
しかし、#130はまだ夜中に私を悩ませています;)

次にやってみたのは、

   double stoploss = 50;
   double SL = 0.0;
   
   //open position
   if(long)  //take long position
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);  
   else     //take short position
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); 
   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Order "+result_ticket+" Successfully Opened");

   //select order
   if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) {
      Log("error="+GetLastError());
      return(-1);
   }    
   entry_price = OrderOpenPrice();
   
   //check stoplevel
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

   //checl freezelevel
   double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
   Log("Freezelevel: " + freezelevel);
   Log("stoploss: " + stoploss);
   if(stoploss < freezelevel)
      stoploss = freezelevel + 1;
   
   if(long)
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
   else
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
   Log("SL: " + SL*pips2dbl);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Stoploss successfully set");

見ての通り、takeprofitを使わないことで、例を簡略化しました。エラーは間違いなくストップロスによって発生するので、takeprofitは必要ない。
私はまず、ストップロス(とtakeprofit)を0にして注文を出し、後でOrderModifyを使ってストップロスを設定しようとします。
その前にMode_StoplevelとMode_Freezelevelをチェック し、必要ならストップロスを調整します。(ログにあるように、最初はストップロスが50で、Mode_Stoplevelが75なので、ストップロスをMode_Stoplevel+1、つまり76に設定します)

RaptorUK と SDC:
MarketInfo(MODE_FREEZELEVEL) returns 0. Freezelevel が問題とは思えませんね。
ログファイルに出力を入れてみました。

SDC:
念のため、OrderOpenPrice を呼び出す前に OrderSelect も挿入してみました。ログを見ると、OrderSelectが機能したことがわかります。そうでなければ、コードはここまで進まなかったでしょう(exit -1)。

WHRoederです。
私はSDCのシンプルな例に従いました。しかし、私は、ストップロスを設定する際に、ピップス4/5桁の調整を使用することで、それを拡張しました。また、注文はまずstoplossとtakeprofitをゼロに設定して開き、次にOrderModifyでstoplossを設定していることがわかります。S/LとT/Pをゼロに設定した下のログにあるように、注文は正常に開かれますが、次のステップのOrderModifyでS/Lを設定することができません。

以下は完全なログです:

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

皆さんの継続的な協力に本当に感謝していますし、問題を絞り込めそうです :)
それで、他に何が問題なのでしょうか?他に何か試せることはありますか?

shinobi
 
RaptorUK:

スプレッドは0.25

#ESZ1,M5:スプレッド0.25000000

OK、あなたは...1242.00Ask)で買いを建てます。

#ESZ1,M5: オープン #13679252 買い1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5: 注文 13679252 成功裏にオープン

そして、TPを買値+2 * Spread、SLを 買値-2 * Spreadに 設定して修正しようとします。

STOP_LEVEL は 3 * Spread ではありませんか? Stop が近すぎます ... ...

#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
削除済み  
Hey Raptor,

ああ、だからここでstoplevelを確認 するんだ(上のコードから):

   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

最後の例では、stoplossは3*Spread +1である76に設定されています。
これは十分な距離でしょう?
 
shinobi:
こんにちは、Raptorです。

そうなんです、だからここでstoplevelをチェックするんです(上のコードから)。


この例では、stoplossは76に設定されていますが、これは3*Spread +1です。
これで十分な距離でしょう?
でも、四捨五入の問題があって、SLがSTOP_LEVELから0.25以上離れるように、一番近い0.25(S&P500は0.25ステップで動く)に丸める必要があるんじゃないかと思うんですが・・・・・・・・。
削除済み  
良いアイデアですが、残念ながらそれも役に立ちませんでした。
私がやったことは次のとおりです。

まず、2倍を最も近い2倍に丸めるカスタム関数を 書きました:
double DoubleRound(double number, double step)
{
    double mod = MathMod(number, step);
    if(mod < step/2.0)
      step = 0;
    double rounded = number - mod + step;
    return (rounded);
}

これはあなたが期待したとおりの働きをします。DoubleRound(1237.687360000)で呼び出すと、1237.50が返されます。

そして、OrderModifyを呼ぶ直前にS/Lで使ってみました。そして、MODE_TICKVALUEを使いましたが、#ESZ1では0.25です。
つまり、

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE));

 
  Log("SL: " + SL);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }

ログを見ると、四捨五入はうまくいっていることがわかります。しかし、ストップロスはまだ拒否されました :/

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

他に何が問題なのか想像がつきません!この#130は本当にしつこいです!!!
 

あなたは、売りを オープンしました

#ESZ1,M5: 開く #13708089 sell 1.00 #ESZ1 at 1239.75 ok

で、その下に SLを設定しようとした ... ...

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5:エラー=130