// В глобальных переменных объявляем ещё одина массив, теперь с символами с которыми работает наш мультивалютный советникstring gsa_Symbols[];
// Для использования его в советнике, нужно предварительно задать его размер и заполнить символами// (как это сделать - отдельная тема)// сама функцияint fMyTickets (string ar_Symbol[], // заполненный массив рабочих символовdouble& ar_Tickets[][11], // массив тикетов (для заполнения)int fi_Magic = -1) // MagicNumber
{
int NUM_Symbol, li_cnt = 0; // счетчик заполненияint li_total = OrdersTotal();
string ls_Sym;
//----for (int li_int = li_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS))
{
ls_Sym = OrderSymbol();
//---- Определяем номер символа в массиве (фильтр по Symbol)
NUM_Symbol = fGetNumElementInArray_STR (ar_Symbols, ls_Sym);
//---- Если ордер не "свой" - пропускаемif (NUM_Symbol < 0)
{continue;}
//---- проверка MagicNumberif (OrderMagicNumber() != fi_Magic)
{continue;}
//---- заполняем массив
ar_Tickets[li_cnt][0] = OrderTicket();
ar_Tickets[li_cnt][1] = OrderType();
ar_Tickets[li_cnt][2] = OrderLots();
ar_Tickets[li_cnt][3] = OrderOpenPrice();
ar_Tickets[li_cnt][4] = OrderProfit() + OrderSwap() + OrderCommission();
ar_Tickets[li_cnt][5] = OrderStopLoss();
ar_Tickets[li_cnt][6] = OrderTakeProfit();
ar_Tickets[li_cnt][7] = OrderOpenTime();
ar_Tickets[li_cnt][8] = OrderMagicNumber();
ar_Tickets[li_cnt][9] = OrderExpiration();
//---- для дальнейших вычислений не лишним будет запомнить номер индекса символа в массиве символов
//---- но для этого не забудьте увеличить размер массива тикетов при его объявлении gda_Tickets[30][11]
ar_Tickets[li_cnt][10] = NUM_Symbol;
//---- увеличим счётчик заполненных тикетов
li_cnt++;
}
}
//----return (li_cnt);
}
// Объявляем массив в глобальных переменныхdouble gda_Tickets[30][10]; // массив для хранения информации о "своих" ордерах:// gda_Tickets[][0] - Ticket// gda_Tickets[][1] - Type// gda_Tickets[][2] - Lots// gda_Tickets[][3] - Open Price// gda_Tickets[][4] - Order Profit// gda_Tickets[][5] - Stop Loss// gda_Tickets[][6] - Take Profit// gda_Tickets[][7] - Open Time// gda_Tickets[][8] - MagicNumber// gda_Tickets[][9] - Expiration Time// Добавляем массив для сбора ститистикиdouble gda_AddInfo[5]; // массив для хранения дополнительной информации по работе советника// gda_AddInfo[0] - количество соих ордеров (всех)// gda_AddInfo[1] - количество своих рыночных ордеров// gda_AddInfo[2] - общий размер открытых рыночных лотов// gda_AddInfo[3] - общий профит по открытым позициям// gda_AddInfo[4] - максимальная просадка по открытым позициямvoid fMyTickets (double& ar_Tickets[][10], // массив тикетов (для заполнения)double& ar_Info[], // массив для заполнения дополнительной информациейint fi_Magic = -1) // MagicNumber
{
int li_cnt = 0; // счетчик заполненияint li_total = OrdersTotal();
double tmp_Loss;
//----
tmp_Loss = ar_Info[4];
//---- Обнуляем заполняемый массив перед использованиемArrayInitialize (ar_Info, 0.0);
for (int li_int = li_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS))
{
//---- проверка на Symbolif (OrderSymbol() != Symbol())
{continue;}
//---- проверка MagicNumberif (OrderMagicNumber() != fi_Magic
&& fi_Magic >= 0) // предусматриваем возможность контролтровать любой Magic
{continue;}
//---- заполняем массив
ar_Tickets[li_cnt][0] = OrderTicket();
ar_Tickets[li_cnt][1] = OrderType();
ar_Tickets[li_cnt][2] = OrderLots();
ar_Tickets[li_cnt][3] = OrderOpenPrice();
ar_Tickets[li_cnt][4] = OrderProfit() + OrderSwap() + OrderCommission();
ar_Tickets[li_cnt][5] = OrderStopLoss();
ar_Tickets[li_cnt][6] = OrderTakeProfit();
ar_Tickets[li_cnt][7] = OrderOpenTime();
ar_Tickets[li_cnt][8] = OrderMagicNumber();
ar_Tickets[li_cnt][9] = OrderExpiration();
//---- увеличим счётчик заполненных тикетов
li_cnt++;
//---- заполняем массив дополнительной информацией
ar_Info[0]++;
if (OrderType() < 2)
{
ar_Info[1]++;
ar_Info[2] += OrderLots();
ar_Info[3] += OrderProfit() + OrderSwap() + OrderCommission();
}
}
}
//---- Учитываем максимальную просадку
ar_Info[4] = MathMin (ar_Info[3], tmp_Loss);
//----return;
}
マルチカレンシー用のバリエーション#2。
// В глобальных переменных объявляем массив, с символами, с которыми работает наш мультивалютный советникstring gsa_Symbols[];
// Массив с дополниетельной информацией должен быть 2-ух мерным// 1-ый индекс - это номер символа в массиве символов gsa_Symbols[]// Не забудьте перед его использованием задать ему размер в первом измерении равный количеству используемых символов// ArrayResize (gda_AddInfo, ArraySize (gsa_Symbols));double gda_AddInfo[][5]; // массив для хранения дополнительной информации по работе советника// gda_AddInfo[][0] - количество соих ордеров (всех)// gda_AddInfo[][1] - количество своих рыночных ордеров// gda_AddInfo[][2] - общий размер открытых рыночных лотов// gda_AddInfo[][3] - общий профит по открытым позициям// gda_AddInfo[][4] - максимальная просадка по открытым позициям// Для использования его в советнике, нужно предварительно задать его размер и заполнить символами// (как это сделать - отдельная тема)void fMyTickets (string ar_Symbol[], // заполненный массив рабочих символовdouble& ar_Tickets[][11], // массив тикетов (для заполнения)double& ar_Info[][5], // массив для заполнения дополнительной информациейint fi_Magic) // MagicNumber
{
int NUM_Symbol, li_cnt = 0, li_Range = ArraySize (ar_Symbol); // счетчик заполненияint li_total = OrdersTotal();
string ls_Sym;
double tmp_Loss[];
//----//---- Инициализируем временный массив для хранения сведений о максимальной просадкеArrayResize (tmp_Loss, li_Range);
//---- Сохраняем в него эти сведенияfor (int li_int = 0; li_int < li_Range; li_int++)
{tmp_Loss[li_int] = ar_Info[li_int][4];}
//---- Обнуляем используемый массив
ArrayInitialize (ar_Info, 0.0);
for (int li_int = li_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS))
{
ls_Sym = OrderSymbol();
//---- Определяем номер символа в массиве (фильтр по Symbol)
NUM_Symbol = fGetNumElementInArray_STR (ar_Symbols, ls_Sym);
//---- Если ордер не "свой" - пропускаемif (NUM_Symbol < 0)
{continue;}
//---- проверка MagicNumberif (OrderMagicNumber() != fi_Magic
&& fi_Magic >= 0) // предусматриваем возможность контролтровать любой Magic
{continue;}
//---- заполняем массив
ar_Tickets[li_cnt][0] = OrderTicket();
ar_Tickets[li_cnt][1] = OrderType();
ar_Tickets[li_cnt][2] = OrderLots();
ar_Tickets[li_cnt][3] = OrderOpenPrice();
ar_Tickets[li_cnt][4] = OrderProfit() + OrderSwap() + OrderCommission();
ar_Tickets[li_cnt][5] = OrderStopLoss();
ar_Tickets[li_cnt][6] = OrderTakeProfit();
ar_Tickets[li_cnt][7] = OrderOpenTime();
ar_Tickets[li_cnt][8] = OrderMagicNumber();
ar_Tickets[li_cnt][9] = OrderExpiration();
ar_Tickets[li_cnt][10] = NUM_Symbol;
//---- увеличим счётчик заполненных тикетов
li_cnt++;
//---- заполняем массив дополнительной информацией
ar_Info[NUM_Symbol][0]++;
if (OrderType() < 2)
{
ar_Info[NUM_Symbol][1]++;
ar_Info[NUM_Symbol][2] += OrderLots();
ar_Info[NUM_Symbol][3] += OrderProfit() + OrderSwap() + OrderCommission();
ar_Info[NUM_Symbol][4] = MathMin (tmp_Loss[NUM_Symbol], ar_Info[NUM_Symbol][3]);
}
}
}
//----return;
}
(Integer ): Instant Executuionでは、注文は事前に設定したストップロスやテイクプロフィットで開くことができ、スリッページをピップで設定します。成行注文では、あらかじめストップロスやテイクプロフィットを設定した注文を出すことはできませんし、スリッページのパラメータもありません。注文は、ブローカーによる執行の時点で利用可能な任意の価格で発注されます。ストップロスやテイクプロフィットは、注文が発注された直後に設定することができます。ほとんどのディーリング・センターは Instant Execution モードで動作します。ディーリング・センターがMarket Executionモードで運営されているところはそれほど多くない。
Market Executionに切り替える証券会社が増えている。すぐにIntegerから与えられた情報は無意味になります。
というのは、2つのモードに関する情報だけです。
と、FAQの最後の段落に書いてある通り、まさに「トレンド」です!https://www.mql5.com/ru/forum/131853/page3#464977
-------
ところで、用語集はどうなっているかというと、むしろ患者は生きているのか?
1.そして、FAQの最後の段落には、まさにその傾向が書かれています!https://www.mql5.com/ru/forum/131853/page3#464977。
-------
2.ところで、用語集はどうなっているかというと、患者はむしろ生きているのか?
1.リンク先のFAQの最後の段落を見ず、granit77さんの 投稿にのみ反応。
2.私自身が協力を申し出た箇所を読ませていただきました。しかし、その完成度は望むところである。実質的に付け加えることは何もありません。もっと早く報告すればよかった~と後悔しています。
それでも、プログラマーやトレーダーが使うような専門用語の略語は、このセクションで追加することができます。私は新しい仕事を始めたばかりで、今は自由な時間がほとんどなく、少なくとも自分のプロジェクトを継続するのがやっとです。ですから、少しずつ「紙に書いて」、それが溜まってきたらセクションに追加していこうと思っています。いい?
質問:「自分の」オーダーの配列の取得について
回答:コードの最適化の観点からは、この方法が便利です。まず、「フレンドリー」(つまり、与えられたMagicNumber()を持つ注文)注文の「修正」を行い、それぞれのチケットに関する完全な情報を持つチケットの配列を作成し、次に同じチケットの配列で他のすべてのチェック(ポジションの決済や変更)を行います。例1.1つの通貨ペアのチケットの情報を収集する。
お好みで、この関数をint型で宣言して、「自分の注文」の数を返すようにしてもよいでしょう。
私たちのEAが多通貨の場合。
例2.複数の通貨ペアのチケット情報を収集。
この場合、「友好的」なシンボルをチェックするために、もう一つ小さな関数が必要になる。
で、この関数はこのような形になります。
Question:「自分の」注文チケットの配列の取得
回答:(続き)
例えば、最大ドローダウン、総利益など、EAにその仕事に関する追加の統計情報を持たせたい場合も不思議ではありません。そのため、追加のリクエストでサーバーを「邪魔」する必要がないように、私たちの機能に機能を追加することをお勧めします(失礼)。この場合、関数は次のようになります。
モノカレンシーEA用のバリエーション1。
マルチカレンシー用のバリエーション#2。
上記のチケット情報収集の例では、大半の場合、この情報で十分です。しかし、より複雑なシステムでは、例えば、Expert Advisorにバーチャルストップが実装されている場合、チケットの配列にそれらに関する情報を保存することを誰も禁じていません。
一般的には、空想や狂信、そしてMQL4の知識レベルによって制限されます。
TarasBY
サーバーに不必要にリクエストを「邪魔」しないために...。
注文を受ける際、サーバーの邪魔にならないようにする。注文情報を配列にまとめるという思想 -- UG.これはChaVoでは決して許されることではありません。
別の選択肢を提案する。「自分の」オーダーで作業する必要性について