//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
Print(GetMagic());
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать//для нашего ордера уникальный маджикint arr[];
int n=-1;
int OT=OrdersTotal();
for(int i=0; i<OT; i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
n++;
ArrayResize(arr,n+1);
arr[n]=OrderMagicNumber();
}
}
}
}
ArraySort(arr);
OT=ArraySize(arr);
for(int i=0; i<OT; i++)
if(arr[i]!=i) return i;
return OT;
}
//-- удаляет копии с массиваint ArraySearchInt(int& m[], int e)
{
for(int i=0; i<ArraySize(m); i++) {
if(m[i]==e) return(i);
}
return(-1);
}
もし、「-1」が嫌なら、こうすればいい。
いいえ、できません。この方法で配列にアクセスすると、プログラムがクラッシュします。
せいぜい内部の配列にアクセスしても、必要なデータを見逃すか、単にループの中で到達できないだけでしょう。
基本的にはシンプルで、あなたのユニークは、異なるマジシャン間のミスマッチな注文をすべてまとめる...というものです。
例えば、3つの注文がある場合
最初の反復でmagic=1unique=0、反復の終わりでunique=2に なる。
2回目の反復でmagik=2unique=2、反復終了時にuniqueは=3に なる
3>=全オーダーの数なので、whileループが壊れる...。そして魔法=3は確認されなかった...。だから、魔法はまた2であり、すべてにおいてそうである。
1次にはデフォルトでマジック=1が与えられています。
反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つあるとき) magic = 1 はまだ 1 で unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (no match) and the retorn is given to the 2nd order magic = 2.
3回も同じはずですが...。
全工程を印刷したかったのですが、何か問題が発生しました。
1次には、デフォルトで magic = 1 が与えられる。
反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つあるとき) magic はまだ 1 and unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (一致しない) そして retorn は2次 magic = 2 に割り当てられる。
3番目は同じはずだ...。
全工程を印刷したかったのですが、何か問題が発生しました。
より多くの、すべてのプログラミング 言語を目指します。
単純なことです。プログラミング言語では、カウントはゼロから始まります。配列の最初のセルのインデックスは0になります。したがって、それを含むゼロの前に逆ループを行う必要があります。すなわち >=0
OrdersTotal()は、例えば10と出力します。そして、配列の最後のインデックスが9であるのに対して、10からループを開始します(ゼロから開始することをお忘れですか)。また、存在しない配列セルにアクセスした場合はどうなるのでしょうか?その通りです。配列の限界を超えて、メモリの未割り当て領域に入って しまったため、プログラムはクリティカルエラーでクラッシュします。
これは確かにしっかりした松葉杖 です。読めば、学べば、すべてが見えてくる。
C/C++については、無料の良いコースが山ほどあります。
Mqlは彼らに近く、自由に学ぶことができる。幸いなことに、深い知識は必要ありません。しかし、少なくとも言語の構文や アルゴリズムの基本的な基礎は知っている。
そうでなければ、プラットフォームやアルゴリズムに関する協議ではなく、どこに置くか、ループとは何か、なぜインデックスが0なのか、といった小学校レベルの対話になり、ナンセンスな話題になってしまいます。
例えば、intuit.ruというサイトがあります。C言語やアルゴリズムのコースがあり、時間をかけて、長くても2週間ほどです。同時に紙も手に入れることができます :-)
そうでなければ、プラットフォームやアルゴリズムに関する協議ではなく、どこに置くか、ループとは何か、なぜインデックスが0なのか、といった小学校レベルの対話になり、ナンセンスな話題になってしまいます。
例えば、intuit.ruというサイトがあります。C言語やアルゴリズムのコースがあり、時間をかけて、長くても2週間ほどです。同時に紙も手に 入るかもしれません:-)
こんな感じ?
OrdersTotal() は、例えば10と表示されます。しかし、配列の最後のインデックスは9です(ゼロから数えていることを思い出してください)。また、存在しない配列セルにアクセスした場合はどうなるのでしょうか?その通りです。配列の限界を超えて、メモリの未割り当て領域に入って しまったため、プログラムはクリティカルエラーでクラッシュします。
訂正します...致命的なエラーは発生せず、OrderSelectのブール値がfalseを返すだけです...それだけです...もちろん、避けるに越したことはないのですが......間違ったコード機能を使うと、起こりうるエラーを予測するのが難しくなるからです......。
1次には、デフォルトで magic = 1 が与えられる。
反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つある場合) magic = 1 and unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (no match) and retorn is assigned to the 2nd order magic = 2.
3回も同じことをする...。
ただ、ユニークの 充填がすごく早くなって限界に達して、魔法がほとんど育たなく なるのが目に見えているので......。一般的に、ループ制御と、この変数が膨らむループ内のロジックの両方に同じ変数を使うのは間違いでした......。
この文脈で解決策を見つけるには、印刷が必要ですが、私は問題を再定式化することをお勧めします......例えば、ループによって注文の最大マジックを求め、それを+1して返す、それが正しいシンプルな解決方法でしょう。
このようにすれば、コードは必要に応じて呼び出されるため、その重さは問題にはなりません
テストでは、Buy/Sellを使用しました。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するTips、ディスカッションなど。
ヴィタリー・ムジチェンコ, 2021.10.19 23:08
少し訂正させていただきます。クリティカルなエラーは発生せず、OrderSelectというブール変数がfalseを返すだけ...です。しかし、もちろん避けたほうがいい...なぜなら、コードの機能を正しく使用しないと、起こりうる落とし穴を予測するのが難しいから...。
魔法はほとんど成長 しないのに、ユニークはものすごいスピードで充填されて限界に達して いるようにしか見えないのですが......。一般に、ループ制御とループ内のロジックの両方に同じ変数を使うのは間違っていて、この変数が膨らんでしまう...。
この文脈で解決策を見つけるには、印刷が必要ですが、私は問題を再定式化することをお勧め します......例えば、ループによって注文の最大マジックを求め、それを+1して 返す、それが正しいシンプルな解決方法でしょう。
このようにすれば、コードは必要に応じて呼び出されるため、その重さは問題にはなりません
テストでは、Buy/Sellを使用しました。