FAQ(よくある質問)を埋めるためのサブワークショップ。同志を助けよう! - ページ 13

 
Instant Executuion と Market Execution の間の違いは何ですか?

(Integer ): Instant Executuionでは、注文は事前に設定したストップロスやテイクプロフィットで開くことができ、スリッページをピップで設定します。成行注文では、あらかじめストップロスやテイクプロフィットを設定した注文を出すことはできませんし、スリッページのパラメータもありません。注文は、ブローカーによる執行の時点で利用可能な任意の価格で発注されます。ストップロスやテイクプロフィットは、注文が発注された直後に設定することができます。ほとんどのディーリング・センターは Instant Execution モードで動作します。ディーリング・センターがMarket Executionモードで運営されているところはそれほど多くない。
 
Market Executionに 切り替える証券会社が増えている。すぐにIntegerから与えられた情報は無意味になります。
 
joo:
Market Executionに切り替える証券会社が増えている。すぐにIntegerから与えられた情報は無意味になります。

というのは、2つのモードに関する情報だけです。

と、FAQの最後の段落に書いてある通り、まさに「トレンド」です!https://www.mql5.com/ru/forum/131853/page3#464977

-------

ところで、用語集はどうなっているかというと、むしろ患者は生きているのか?

ファイル:
mql4_10.zip  419 kb
 
sergeev:

1.そして、FAQの最後の段落には、まさにその傾向が書かれています!https://www.mql5.com/ru/forum/131853/page3#464977

-------

2.ところで、用語集はどうなっているかというと、患者はむしろ生きているのか?

1.リンク先のFAQの最後の段落を見ず、granit77さんの 投稿にのみ反応。

2.私自身が協力を申し出た箇所を読ませていただきました。しかし、その完成度は望むところである。実質的に付け加えることは何もありません。もっと早く報告すればよかった~と後悔しています。

それでも、プログラマーやトレーダーが使うような専門用語の略語は、このセクションで追加することができます。私は新しい仕事を始めたばかりで、今は自由な時間がほとんどなく、少なくとも自分のプロジェクトを継続するのがやっとです。ですから、少しずつ「紙に書いて」、それが溜まってきたらセクションに追加していこうと思っています。いい?

 
joo:

大丈夫
 

質問:「自分の」オーダーの配列の取得について

回答:コードの最適化の観点からは、この方法が便利です。まず、「フレンドリー」(つまり、与えられたMagicNumber()を持つ注文)注文の「修正」を行い、それぞれのチケットに関する完全な情報を持つチケットの配列を作成し、次に同じチケットの配列で他のすべてのチェック(ポジションの決済や変更)を行います。
例1.1つの通貨ペアのチケットの情報を収集する。
// Сначала объявляем массив в глобальных переменных
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] - OrderProfit
       // gda_Tickets[][5] - Stop Loss
       // gda_Tickets[][6] - Take Profit
       // gda_Tickets[][7] - Open Time
       // gda_Tickets[][8] - MagicNumber
       // gda_Tickets[][9] - Expiration Time
// Не забываем о счётчике ордеров (он нам ещё понадобится)
int   gi_cnt_Tickets;
// сама функция
void fMyTickets (double& ar_Tickets[][10], int fi_Magic = -1)
{
    int li_cnt = 0; // счетчик заполнения
    int li_total = OrdersTotal();
//----
    for (int li_int = li_total - 1; li_int >= 0; li_int--)
    {
        if (OrderSelect (li_int, SELECT_BY_POS))
        {
            //---- проверка на Symbol
            if (OrderSymbol() != Symbol()) 
            {continue;}
            //---- проверка MagicNumber
            if (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++;
        }
    }   
    gi_cnt_Tickets = li_cnt;
//----
    return;   
}

お好みで、この関数をint型で宣言して、「自分の注文」の数を返すようにしてもよいでしょう。

gi_cnt_Tickets = fMyTickets (gda_Tickets, Magic);

私たちのEAが多通貨の場合。
例2.複数の通貨ペアのチケット情報を収集。

この場合、「友好的」なシンボルをチェックするために、もう一つ小さな関数が必要になる。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:      Получаем номер элемента в массиве string                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetNumElementInArray_STR (string sArray[], string Element)
{
//----
    for (int l_int = 0; l_int < ArraySize (sArray); l_int++)
    {
        if (sArray[l_int] == Element)
        {return (l_int);}
    }
//---- 
    return (-1);
} 

で、この関数はこのような形になります。

// В глобальных переменных объявляем ещё одина массив, теперь с символами с которыми работает наш мультивалютный советник
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;}
            //---- проверка MagicNumber
            if (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);   
}
 

Question:「自分の」注文チケットの配列の取得

回答:(続き)

例えば、最大ドローダウン、総利益など、EAにその仕事に関する追加の統計情報を持たせたい場合も不思議ではありません。そのため、追加のリクエストでサーバーを「邪魔」する必要がないように、私たちの機能に機能を追加することをお勧めします(失礼)。この場合、関数は次のようになります。

モノカレンシーEA用のバリエーション1。

// Объявляем массив в глобальных переменных
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))
        {
            //---- проверка на Symbol
            if (OrderSymbol() != Symbol()) 
            {continue;}
            //---- проверка MagicNumber
            if (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;}
            //---- проверка MagicNumber
            if (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;   
}

上記のチケット情報収集の例では、大半の場合、この情報で十分です。しかし、より複雑なシステムでは、例えば、Expert Advisorにバーチャルストップが実装されている場合、チケットの配列にそれらに関する情報を保存することを誰も禁じていません。

double gda_Tickets[30][12]; // массив для хранения информации о "своих" ордерах:
       // 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
       // gda_Tickets[][10] - Virtual SL
       // gda_Tickets[][11] - Virtual TP

一般的には、空想や狂信、そしてMQL4の知識レベルによって制限されます。

 

TarasBY

サーバーに不必要にリクエストを「邪魔」しないために...。

注文を受ける際、サーバーの邪魔にならないようにする。注文情報を配列にまとめるという思想はUG。FAQに載るはずがない。
 
TheXpert:
注文を受ける際、サーバーの邪魔にならないようにする。注文情報を配列にまとめるという思想 -- UG.これはChaVoでは決して許されることではありません。

別の選択肢を提案する。「自分の」オーダーで作業する必要性について
 
私はお勧めしません。チケットの配列は全く必要ないことの方が多い。そして、正しいことは、可能な限り最新の情報を常に端末に問い合わせることだと思います。