for(int i=0; i<OrdersTotal(); i++){if(!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )))continue;//выбираем из истории счетаif(OrderSymbol()!=Symbol())continue;if(OrderMagicNumber()== Magic){
позиции =true;}}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара открытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfBarOpenLastPos(string sy="0",int tf=0,int op=-1,int mn=-1){datetime t;int i, k=OrdersTotal();if( sy==""|| sy=="0") sy=Symbol();for( i=0; i< k; i++){if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)){if(OrderSymbol()== sy){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if( op<0||OrderType()== op){if( mn<0||OrderMagicNumber()== mn){if( t<OrderOpenTime()) t=OrderOpenTime();}}}}}}return(iBarShift( sy, tf, t, True));}//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара закрытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfBarCloseLastPos(string sy="0",int tf=0,int op=-1,int mn=-1){datetime t;int i, k=OrdersHistoryTotal();if( sy==""|| sy=="0") sy=Symbol();for( i=0; i< k; i++){if(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()== sy){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if( op<0||OrderType()== op){if( mn<0||OrderMagicNumber()== mn){if( t<OrderCloseTime()) t=OrderCloseTime();}}}}}}return(iBarShift( sy, tf, t, True));}
一例を挙げると私のコードでは、これらの関数を次のように使っています。
//======================================================================// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if( NumberOfBarOpenLastPos(NULL,1440,-1, Magic)==0|| NumberOfBarCloseLastPos(NULL,1440,-1, Magic)==0)
Trade=false;else Trade=true;//================================================================
あるいはこんな感じ。
//======================================================================// запрет торговли , если за последние 85 баров графика Н1//т.е. за посл.85 часов)уже были открыты позиции или// закрыты позиции с заданным магикомif( NumberOfBarOpenLastPos(NULL,60,-1, Magic)<=85|| NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85)
Trade=false;else Trade=true;
これらのファイル(mt4に実装済み)の関数を使用(呼び出し)した場合、EAが正しく動作しない場合、コード内で発生したエラーの番号をログで確認することができます。
例えば、GetLastError()関数を呼び出すとします。
この場合、コードに誤りがあったり、外部パラメータの設定が間違っていたりすると、ログにそのエラーの番号が表示されます。
例えば、130。
そして、その数字の解読は、-https://book.mql4.com/ru/appendix/errors のページで見ることができます。
そして、すべてのコードを検索する必要はありません。なぜなら、この番号によって、どこでミスが発生したかがすでに分かっているからです
少し訂正させてください:GetLastError関数はヘッダーファイルなしで呼び出すことができますが、サイトをナビゲートせずにエラーの説明を取得するには、ライブラリをリンクする必要があります。
関数を正しく呼び出していない。
この関数は次のように呼び出されます: if (NumberOfPositions(NULL,Magic)> 1)
このように表示されるはずです。
違いを感じてください(あなたは「-1」を見逃しています)!そして、あなたのコードを変更してください。
それを制御するために、チャートにコメントを印刷することができます。例えば、こんな感じ(START関数の冒頭)。
2つ目の条件については、私なら(「うまいこと考えずに」)別のマジシャンと別の関数Open_Buy_2()を設定して、2つ目の条件によってポジションをオープンさせます !2番目の条件のコードは次のようになります。
のライドを行います。
また、2つ目の条件がうまくいかない理由も理解できました。もしかしたら、問題の説明が間違っていたのかもしれません。
ずっと前に決済された注文でも、EAが開いたかどうか確認できるようにしたい。NumberOfPositionsは機能しますが、オープンポジションの数しかカウントされません。(それだから駄目なんだ)
私のEAのコードには、前のポジションのデータを考慮して次のポジションを開くスクリプトがあり、前のポジションがない場合は、この条件なしで最初の注文を開く必要があります(そうしないとEAが起動しません)。 したがって、このEAの少なくとも1つの注文がオープンされたかどうか(その後、注文がクローズされたとしても)を理解する機能が必要です。まだ注文がない場合(作業開始)、最初の注文は第2条件を考慮せずに開かれ、それ以降の注文は第2条件を考慮して、つまり前の注文のデータを使用して開かれます。
このように機能を変更することは可能でしょうか?
iTime 機能が何を示しているのか教えてください。
10桁の数字は何なんだ?秒単位?
年-月-日-時間-分に変換するとどうなるのでしょうか?
なるほど。このようにポジションが履歴に残っているかどうかを判断することができます。
しかし、その場合、あなたのコードはテスターでしか動作しないでしょう。そうしないと、EAオンラインをオンにするたびにマジックを変更しなければならないからです。
どうやら、アカウント履歴を取得する時間を設定する必要があるようです。
例:最後にそのマジックを使ったトレードが行われたのはいつですか?6ヶ月前なのか、24時間前なのか?
最後にオープンまたはクローズした取引のバー番号(現在のバーからヒストリーの後ろまで数える)を返す関数があります。
一例を挙げると私のコードでは、これらの関数を次のように使っています。
あるいはこんな感じ。
うーん、同じような単純な問題で苦労しています。多くのポジションを開くが、必要なのはせいぜい1つだけで、買いが閉じて売りを開く信号が来たとき...。以下のコードで何が間違っているのか、ヒントと修正をお願いします。マジックを処方する必要があるのはどこですか?もし差し支えなければ、上方向に買いクロス(1オーダー以下)、下方向に売りクロス(1オーダー以下)した場合の、間抜けな例を作ってください。 これで、多くの初心者の疑問がすぐに解決すると思います。よろしくお願いします。
またまた愚問です。
- 外部変数で要素数を指定する配列の宣言方法。
こんな感じです。
またまた愚問です。
- 外部変数で要素数を指定する配列の宣言方法。
https://docs.mql4.com/ru/array/ArrayResize
ポジションをたくさん持っていても、必要なのはせいぜい1つだけで、買いが終了して売りのシグナルが出ればOKです。以下のコードで何が間違っているのか、ヒントと修正をお願いします。マジックを処方する必要があるのはどこですか?もし差し支えなければ、上方向に買いクロス(1オーダー以下)、下方向に売りクロス(1オーダー以下)した場合の、間抜けな例を作ってください。 これで、多くの初心者の疑問がすぐに解決すると思います。ありがとうございました。
こんな風に試してみてください。
(NumberOfPositions()にはもっと気を配る必要があります。理由があってヘッダに書かれているのです。
/|説明:|ポジションの数を返します。
//| パラメータ
//| sy - 測定器名 ("" または NULL - 現在のシンボル) |.
|| op - 操作 ( -1 - 任意の位置 )
//| mn - マジックナンバー ( -1 - 任意のマジックナンバー) |...
//+----------------------------------------------------------------------------+