// 未決済注文のチェック int _GetLastError = 0, _OrdersTotal = OrdersTotal(); int z;
//---- for ( z = _OrdersTotal-1 ; z >=0; z -- ) { //The loop for - going through all open orders //---- もしポジション選択中にエラーが発生したら、次に進む if ( !OrderSelect( z, SELECT_BY_POS ) ){ _GetLastError = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } } { _GetLastError = GetLastError(); } { _GetLastError = GetLastError()//Finished //通貨とマジックのバインド //---- もしポジションが現在の商品によってオープンされていない場合、それをスキップ if ( OrderSymbol( ) != Symbol( ) ) continue; // ERROR //Finished
//---- If MagicNumber is not equal to Expert_ID, skip this position if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR //Finished if (OrderType()==OP_BUY) { BuyClot=OrderLots(); }. if (OrderType()==OP_SELL) { SellClLot=OrderLots(); }. OpenedLots=OrderLots(); LotCloseBuy =NormalizeLot(OpenedLots); // ロット数 LotCloseSell =NormalizeLot(OpenedLots); // ロット数
その結果、クローズブロックにカスタムポジションカウンティングが追加され、「正しい」クローズになりましたが、エラー131は まだログに数回ポップアップします。
このようなループへのオーダーカウントの挿入は、すでに1つのオーダーチェックがあることを考えると正常なのか、また
エラー131が発生しないようにコードを修正していただけませんか?
ありがとうございました。
エラー131が発生しないようにコードを修正していただけないでしょうか。
ありがとうございました。
また、分割後のロットサイズは誰が正規化してくれるのでしょうか?それゆえ、エラーが発生するのです。
Alexは、close関数にロットを渡す前に、NormalizeLot() でそのサイズを正規化します。
イゴール、アレキサンダーありがとうございます。
確かに、関数SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red ); でLot/3 (Lot/2, Lot) を 0.01 で置き換えてロットを確認すると、エラー131を回避することが出来ました。このまま(0.01)でもいいのですが、まず、Lot型で閉じる方が正しいです。次に、ユーザー関数とそのプログラム内での呼び出しに初めて遭遇し、むしろ興味深いことがわかりました。コード内ですべて正しく添付し、すべて動作しているようですが、エラー131はまだ残っています。コードをご覧ください。NormalizeLotの呼び出し関数で何かミスったのかもしれません。
申し訳ございません。元のコードでは、行
RefreshRates()。
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );
は、条件に従って、正しいLotCloseです。
Lot =OrderLots(); // ロットの数
LotClose =NormalizeLot(Lot); // NORMALIZED LOTの値がCLOSED LOTに代入されます。
投稿時に間違って............。
コードをご覧ください。NormalizeLotの呼び出し関数で何かミスをしたのかもしれません。
置き換えてみてください
まで
アレクサンダーさん、おはようございます。
残念ながら、あなたのチップは役に立ちませんでした。ログを解析したところ、あるロットのある部分のクローズと、別のロットのある部分のクローズがほぼ重なった場合に、2つのケースでエラーが発生することがわかりました。
時間的に一致しない場合は、ロットの一部がエラーにならずに終了します。
終値の買いロットと終値の売りロットを別々に正規化しようとしましたが、成功しませんでした。
二重
Lot, // 選択された順番のロット数
LotCloseBuy,
LotCloseSell,
Lot =OrderLots();
LotCloseBuy =NormalizeLot(Lot)です。
LotCloseSell =NormalizeLot(Lot)です。
BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )
SELLCLOSED_3=OrderClose(オーダーチケット(), LotCloseSell, Ask, 0, Red );
イゴール機能
NormalizeLot...............
何かアイデアはありますか?
私はなんという羊なのだろう。うう~、気持ち悪い...。
オーダーループのロットを正規化
//------------------------------------------------------------------------ 4 --
// 注文のカウント
Symb=Symbol(); // 金融商品の名前。
BuyTotal=0; // 買いの注文数
SellTotal=0; // 売りの注文数
for(int i=1; i<=OrdersTotal(); i++) // 注文ループ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // 次の場合
{ // 注文分析:
if (OrderSymbol()!=Symb)continue; // 当社の金融商品ではありません
if (OrderType()>1) // 保留
{
Alert("保留注文を 検出しました。 Expert Advisor は動作していません。");
return; // 終了 start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // 買い注文カウンター
BuyOrdOpPrice=OrderOpenPrice(); // 買い始値
}
if (OrderType()==OP_SELL)
{
SellTotal++; // 売り注文カウンター
SellOrdOpPrice=OrderOpenPrice(); // 売り始値
}
Ticket=OrderTicket(); // 選択した注文番号です。
Tip =OrderType(); // 選択されたオーダーのタイプ。
Lot =OrderLots();
LotCloseBuy =NormalizeLot(Lot)です。
LotCloseSell =NormalizeLot(Lot);
}.
}
......そして、私はオープン・オーダーを考慮した別のループを作り、そこでロットを正規化してクローズしなければなりませんでした!!!!
//--------------------------------------------------------------- 6 --
// 未決済注文のチェック
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;
//---- for ( z = _OrdersTotal-1 ; z >=0; z -- ) { //The loop for - going through all open orders //---- もしポジション選択中にエラーが発生したら、次に進む if ( !OrderSelect( z, SELECT_BY_POS ) ){ _GetLastError = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } } { _GetLastError = GetLastError(); } { _GetLastError = GetLastError()//Finished //通貨とマジックのバインド //---- もしポジションが現在の商品によってオープンされていない場合、それをスキップ if ( OrderSymbol( ) != Symbol( ) ) continue; // ERROR //Finished
//---- If MagicNumber is not equal to Expert_ID, skip this position
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished
if (OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}.
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}.
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // ロット数
LotCloseSell =NormalizeLot(OpenedLots); // ロット数
//買いポジションが開設されているかどうかを確認します。
........................................
イゴール、アレキサンダー、ありがとうございました。ロット正規化機能がないと、やはりデッドロックになりますね......。
こんばんは。
そして、一番最初に発生するエラー。
2009.07.08 21:05:45 TestGenerator: unmatched data error (volume limit 651 at 2009.07.08 19:00 exceeded)
is critical or is just tester error?
ありがとうございます。