//+------------------------------------------------------------------+//| Mustafa |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Mustafa"#property link"https://www.mql5.com"#property version"1.00"#property strict//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int MagicNumber= 100;
intOnInit()
{
//---
DetectExistingPattern();
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+int LastBar=0;
double HighestValue, LowestValue;
voidOnTick()
{
//---
MyStart();
}
void MyStart(){
CloseOpenedOrders();
if (LastBar == Bars) return;
LastBar = Bars;
if (!CheckForExistedOrders()) {
if (CheckTrendPattern()){
PlaceOrders();
};
};
};
bool CheckForExistedOrders(){
for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) returntrue;
};
returnfalse;
};
bool CheckTrendPattern(){
for(int i=10; i>=1; i--) {
if (High[i]>High[i-1])
returnfalse;
};
HighestValue = High[10];
LowestValue = Low[1];
returntrue;
};
void PlaceOrders(){
int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+void CloseOpenedOrders(){
// I will use HighestValue and LowestValue here, so I need to re calculate them.
};
void DetectExistingPattern() {
// Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()// I will find opened order and find the previos pattern that cause me to open that order.
};
EAにはOnStart() はありませんが、おっしゃることはわかります。しかし、OPはあなたのコメントに対しても、次のように言っています。
そうです、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。EAが実行されている間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味するとは限りませんし、最も妥当と思われます。
paranoyakXさんからの詳しい情報が必要です。
はい、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。必ずしも「EAがOnTick()を実行している間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味しているのが最も妥当なところでしょう。
paranoyakX さんからもっと情報が必要です。
こんにちは、皆さん。
これを明確にさせてください。私のコードは、前のバーで非常に基本的なパターンを探して、注文を開くかどうかを決定しますが、新しいバーが来たときにのみ新しい注文を開くことを確認 します。つまり、私は最後のバーの終値を待って、パターンをチェックし、それが問題なければ注文を開きます。
EAを再実行する場合、これらの基本情報(パターンの開始と終了バー、最高値と最安値など)を再び見つけ、グローバル変数に再び入力したいのですが、そのためにこれが必要です。私は、開始と終了の情報を使って、いつ注文を閉じるかを決定します。したがって、EAの実行中にOnInitで新しいバーが表示されなくても、それは十分な問題ではありません。
はい、OnTick()のことです。あなたはまだ「EA実行中」に大きな意味を持たせすぎています。必ずしも「EAがOnTick()を実行している間」ではなく、「EAがチャートにアタッチされている間、つまりEAのライフタイム全体」を意味しているのが最も妥当なところでしょう。
paranoyakXさんからの詳しい情報が必要です。
こんにちは。
これを明確にさせてください。私のコードは、前のバーの非常に基本的なパターンを探して、注文を開くかどうかを決定しますが、新しい注文を開くことは、新しいバーが出てきたときにのみチェックされます。つまり、私は最後のバーの終値を待って、パターンをチェックし、それがOKなら、注文を開くことになります。
EAを再実行する場合、これらの基本情報(パターンの開始と終了バー、最高値と最安値など)を再び見つけ、グローバル変数に再び入力したいのですが、そのためにこれが必要です。私は、開始と終了の情報を使って、いつ注文を閉じるかを決定します。したがって、EAの実行中にOnInitで新しいバーが表示されなくても、それは十分な問題ではありません。
OnInit() の中でそのすべてを行うべきではありません。OnTick()の中で全てのロジック(リカバリーを含む)を行う必要があります。これは重要です。OnInit()の中でやると、予想外の問題が発生し、EAを「初期化」状態にしたまま、そのロジックをすべて実行することになります。だから、正しくやってください。初期化(変数、外部パラメータチェックなど)だけをOnInit() で行い、それ以外はOnTick() で行ってください。
いえいえ、そんなことはありません。私はOnTickですべてを実行しているのですが、単純にこのティックが新しいバーに属しているかどうかをチェック し、私のスタッフを実行しているのです。OnInitで実行しているのは、注文を再検索し、前に計算したパターンを再計算することです。これはOnInitで実行され、現在開いている注文が属するパターンを見つけると言ったのです。
説明できるといいのですが。
いえいえ、そんなことはありません。私はOnTickですべてを実行しているのですが、単純にこのティックが新しいバーに属しているかどうかをチェックし、私のスタッフを行っているのです。OnInitで実行しているのは、注文を再検索し、前に計算したパターンを再計算することです。これはOnInitで実行され、現在開いている注文が属するパターンを見つけると言ったのです。
説明できるといいのですが。
はい、私はあなたの投稿でそれを理解しました私が言いたいのは、OnInit()の中でそれをやってはいけないということです。注文やパターン、その他すべての計算はOnTick()の中で行うべきです。
OnTick()の中でローカルな静的変数を定義して、すべてのチェックと パターン定義を行い、その変数をfalseにセットしてください。
はい、あなたの投稿でそれを理解しました私が言いたいのは、OnInit()の中でそれをしないでください、ということです。注文やパターン、その他すべての計算はOnTick()の中で行うべきものです。
OnTick()の中でローカルな静的変数を定義して、すべてのチェックとパターン定義を行い、そしてその変数をfalseにセットすればいいのです。
すいません、さっきは誤解してました。なぜOnInitでやらないのか?その方が便利じゃないですか?そうすると、最初のティック 以降、ティック ごとに、trueにならないif文を実行することになるのです。これは、コードに不必要な負荷をかけることになると思います。
OnInitが存在する理由は、私のグローバル変数のようなものを初期化するためではないですか?
説明できるといいのですが。
あなたが言っていることを確信するためには、いくつかのコードを見る必要があると思います。例えば、既存のオープントレードを生成したヒストリカルパターンを探しているのは、(a) オープントレードの管理方法、どこで/いつクローズするかなどを教えてくれるからなのか、それとも (b) なぜ既存のトレードが開かれたかを説明するマーカーをチャートに描くためだけなのかが明らかではありません。
私は一般的に、OnTick()でできる限りのことを行い、グローバル変数にはできるだけ状態を保持しないようにすべきだというFMICに同意します。
申し訳ありません、私は以前あなたを誤解していました。なぜOnInitしないのでしょうか?その方が便利じゃないですか?そうすると、最初のティック以降、ティックのたびに、真にならないif文を実行することになります。これは、コードに不必要な負荷をかけることになると思います。
OnInitが存在する理由は、私のグローバル変数のようなものを初期化するためではないですか?
アドバイスありがとうございます。これは私のコードの非常にシンプルなバージョンです。
このスレッドを開いた理由は、DetectExistingPattern()関数 です。