voidOnTick()
{
datetime cTime;
staticdatetime time = 0;
int nOrders;
cTime = iTime(NULL, PERIOD_CURRENT, 0);
nOrders = CountOrders();
if (time != cTime && nOrders == 0)
time = cTime;
elsereturn;
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(nOrders == 0) // теперь это условие можно убрать
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
}
//+-----------------------------------------------------------------------------------------------+voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупкуif(CountOrders()==0&&bSignalBuy())
{
vOrderOpenBuy();
}
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажуif(CountOrders()==0&&bSignalSell())
{
vOrderOpenSell();
}
}
ドブロロシア語でわかりやすく言うと
釣りをするんですね。
あるいは、パントリーから必要なものをそのまま取り出し(OnInit)、走り回らずに釣りをし、帰宅したらパントリーや冷蔵庫にすべて入れる(OnDeinit)ことも可能です。
この 掲示板でご存知の方も多いかもしれませんね。時には耳を傾けて、言われたことを聞くだけでいい。
そうでなければ、質問を受けて、答えを得て、「うそつき」と言って、思ったとおりに行動する。
まずはじっくりと考え、質問し、編集に取りかかることです。
プログラミングで最もシンプルなことは、コードを印刷することだということをご存知ですか?そして、開発の獅子奮迅の活躍はロジックの上で考えている。
。
とんでもない例えですね。その場合、すべての変数、クラスオブジェクトなどをグローバルにして、オンデマンドで作成しないようにしましょう。あるいは、グラフィカルオブジェクトは他のもの(確かに釣竿や網ではありません :)かもしれません。)?ですから、私のやり方は非常に合理的で正当なもので、ただmqlやメタトレーダーがしくじるだけです。
こうすることで、信号を見逃すことがない
私が鈍感なのか、それとも、オープンオーダーがあり、シグナルがあり、バーがすでに新しい場合は条件がないのか、どちらかです。
シグナルが1バー倍以上の長い場合は、バーの最初のティックでも動作します。
問題は、いつ注文を出すか、シグナルが出たときか、次のバーの最初のティックのときか、だけです。私が鈍感なのか、それとも、オープンオーダーがあり、シグナルがあり、バーがすでに新しい場合は条件がないのか、どちらかです。
シグナルが1バー倍以上の長い場合は、バーの最初のティックでも動作します。
唯一の問題は、いつ注文を出すか、シグナルが出た瞬間か、次のバーの最初のティックかです。これで、コードは次のようになります。
開く前に、このキャンドルにオープンポジションがあるかどうか確認してください。ない場合は、開封してください。
原則として、新規注文は、すでに開いているバーのティックで閉じるのが普通です。MakarFXとArtemの指摘は正しい。ですから、こうするのが正しいのでしょう。
原則として、新規注文は、すでに開いているバーのティックで閉じるのが普通です。MakarFXとArtemの指摘は正しい。したがって、正しいことはこうです。
Artemの言う通り、こうあるべきでしょう。
アルテムさんの言う通り、こうでなくっちゃね。
こちらも結果は同じでしょう。ただ、コードはより複雑になっています。同じコードを2つの関数で書くことになり、可読性も 悪くなります。 もっとも、誰でも好きなように、気持ちよく書いているのですが......。
いろいろあるんですよ。
オープンポジションには、オープンタイムがあります。オープン時間をローソク足の時間と比較することで、ポジションをオープン した時間がローソク足の内側かどうか(そしてこれが現在のローソク足であるかどうか)を調べることができます。
また、すべての例で必ず注文数を調べているのはなぜですか?そして、注文がゼロであれば、開封する。これでは、可能性が大きく狭まってしまいます。
一般的には、非常に狭い戦略の方向性に対してのみ、注文数/ポジション数を重視すべきです。
ここでの結果は同じになります。コードだけがより分かりやすくなっています。同じコードを2つの関数で書くことになり、可読性も 悪くなります。 もっとも、誰でも好きなように、気持ちよく書いているのですが...。
あなたのコード
(バーが開いていて、注文が入っていない状態)
信号の確認 - 信号なし
...次のバーを待ちます。
前回と同じ失敗を繰り返した
追伸
これは
は、注文の開封後に実施される必要があります。アルテムさんの言う通り、こんな感じでいいと思います。
あなたのコードでは、1つのポジションが開いている場合、別のポジションは逆の信号で開くことはありません。すなわち、まず、シグナルが入ったら、反対側のポジションがあるかどうかをチェックして、それを決済する必要があります。
しかし、やはりこれだけでは、戦略を改善する可能性が大きく狭まってしまいます。
注文の有無(特に4つ-保留中の注文(これは正しい)およびポジション(これは間違っている))に拘束されることは避けるべきです。
いや、種類別の注文数、ポジション数が手元にあるのは正しいし、必要だ。しかし、シグナルのみで注文がないことを当てにするのは間違っています。
一般的には、注文やポジションを数える機能(注文やポジションの数が変わると構造体を埋める機能が一つ)、ポジションを開く/閉じる機能、注文を設定する機能、アラーム機能などを持つのが正しい方法です。各種トロールの機能、指標からのデータ取得。プラス - ポジション(オープンまたはクローズ)のデータをいくつかの値で比較する機能。
このセットから、どんな戦略も構築できるのです。