//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 21.03.2008 |//| Описание : Открывает позицию и возвращает её тикет. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| op - операция |//| ll - лот |//| sl - уровень стоп |//| tp - уровень тейк |//| mn - MagicNumber |//+----------------------------------------------------------------------------+intOpenPosition(stringsy, intop, doublell, doublesl=0, doubletp=0, intmn=0){//-- skip --
stringlsComm=WindowExpertName()+""+GetNameTF(Period());
//-- skip --
if(isCloseLastPosByStop(NULL,OP_BUY, MagicLong1)){//если одна из открытых позиций BUY вдруг закрылась по стоплосу for(intrb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- ){if(OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES)){//выбираем среди открытых и отложенных ордеров if((OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1)){//закрываем все остальные позиции BUYOrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black);
OrderDelete(OrderTicket());// и удаляем BUY-отложки // return(0); // выходим }}}}
isCloseLastPosByStop()関数です。
この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossが発動した。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。
オンライン用のOpenPosition()関数です。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパート関数の呼び出しは許可されていません; 'stdlib'-'ErrorDescription'.
Expert AdvisorのOpenPosition()関数をリアルで接続したところ、エラー4059。
4059エラーは、テストモードではその機能が使用できないことを意味します。エラー識別子は ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE である。以下の関数がエラーを発生させます。MarketInfo、MessageBox、SendFTP、SendMail、WindowIsVisible、WindowFind、WindowHandle。
NULLをSymbol()に変更したら消えた、その後メッセージが表示された。
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: エキスパート関数の呼び出しは許可されていません; 'stdlib'-'ErrorDescription'.
isCloseLastPosByTake()関数です。
この関数は、最後のポジションを利益確定(Take Profit)するフラグを返します。フラグが立っている -True- TakeProfitが発動されました。フラグを下げた -False- ポジションは別の理由で閉鎖されました。より精度の高い検討位置の選定は、外部パラメータを用いて行う。
isLossLastPos()関数です。
説明: 最後に閉じた位置の損失フラグを返す。フラグアップ -True- 最後のポジションは損失で決済されました。フラグダウン -False- 最後のポジションがゼロ、または利益で決済されました。本機能はスワップ、コミッションを考慮しない。ポジションの選択は、外部パラメータで定義されます。
isTradeToDay()関数を使用します。
説明: 今日の取引フラグを返す。フラグが立った -本当だ- 今日はオープンポジションがあったんだ。フラグダウン -False- 本日、ポジションはオープンしていません。考慮する位置の選択は、外部パラメータで設定します。
isCloseLastPosByStop()関数です。
この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossが発動した。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。
().午後.この関数を使ったコードを実装する際、若干の混乱が生じました。この機能を応用して、こんな風にしました。
ここまではすべて問題なく動作します私が定義したように、すべての買いポジションはクローズされ、買いポジションは削除されます。しかし、その後、Expert Advisorは、エントリーのシグナルに従って、保留中の注文を再設定します。予想通りです。
しかし、その注文は即座に削除されるのですどうやら、その旗はまだそこに掲げられているようだ。しかし、なぜそこにあるのでしょうか?最後のポジションはストップロスではなく、強制的に決済されました。
このような場合、どのように対処すればよいのでしょうか。Expert Advisor が、このアルゴリズムを実行するコマンドを実行した後に閉じてしまった場合、どうすればよいですか?
このような場合、どうすればいいのでしょうか?そうすれば、EA は注文を閉じるコマンドの後に、次の注文を普通に出すことができるようになるのですか?
この問題は、一つの行動だけでなく、相互作用があり、一定の順序で行われるため、タスク全体の文脈で対処する必要があるのです。したがって、タスクを完全に記述する。コードは必要ありません。タスクを言葉で表現すればいい。
ウォーミングアップの質問です。なぜ注文を削除して元に戻す必要があるのですか?改造するのが望ましいと思います。
私の注文やポジションは、利益や損失、ストップやリミットオーダー、その他の理由によって配列にグループ化されています。
このケースでは、逆指値注文を使用して開設され、指定された利益を蓄積している買いポジションの配列を閉じているのです。そして、機能していない他のストップオーダーをすべて削除しています。
//---------------------------------------------------------------------------------------------
さて、コメント機能-Comment(isCloseLastPosByStop())を載せてみました。
見ている。初期状態では、関数 =0 です。ストップロス・コメント(isCloseLastPosByStop())の最初のクローズ後、1に変化し、その後、他のポジションの強制クローズの後、それはゼロに戻らず、1が継続されます。