一个分讲习班,以填补FAQ(常问问题)。让我们帮助同志们! - 页 13

 
即时执行和市场执行的区别是什么?

(整数 ): 通过即时执行,可以用预先设定的止损和止盈打开订单,设置滑点,当经纪人执行订单时的价格偏离交易者的要求价格时,可以打开订单。在市场执行中,不可能用预先确定的止损和/或止盈来开立订单,也没有滑点参数。该订单在经纪人执行订单时以任何可用的价格开仓。止损和/或止盈可以在订单打开后立即设置。大多数交易中心在即时执行模式下工作。没有那么多的交易中心以市场执行模式运作。
 
越来越多的经纪公司正在转向市场执行。很快,Integer提供的信息就会变得无关紧要。
 
joo:
越来越多的经纪公司正在转向市场执行。很快,Integer提供的信息就会变得无关紧要。

这只是关于这两种模式的信息。

而这正是常见问题的最后一段所说的--一种趋势!https://www.mql5.com/ru/forum/131853/page3#464977

-------

顺便说一下,术语表如何,病人是否宁可活着?

附加的文件:
mql4_10.zip  419 kb
 
sergeev:

1.而常见问题中的最后一段正是这样说的--趋势!https://www.mql5.com/ru/forum/131853/page3#464977

-------

2.顺便问一下,术语表如何,病人是否宁可活着?

1.没有看到链接上的常见问题中的最后一段,只对granit77的 帖子做出了反应。

2.我已经阅读了我提供自己帮助的那一节。但它是人们所希望的那样完整。基本上没有什么可补充的。我应该早点报告--我后悔没有这样做。

不过,该部分还是可以增加程序员和交易员正在使用的术语缩写的行话。我刚刚开始一份新的工作,现在我的空闲时间很少,至少勉强可以继续我自己的项目。因此,我将逐渐写下 "在一张纸上",当我积累得更多时,我将把它添加到该部分。好吗?

 
joo:

好的
 

问题:获得一个 "自己 "订单的数组

答:从代码优化的角度来看,这是一种方便的方法:首先,我们对 "友好"(即具有给定的MagicNumber()的订单)订单进行 "修订",创建一个带有每个订单完整信息的票据数组,然后我们用同一个票据数组进行所有其他检查(用于平仓和修改头寸)。
例子#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);   
}
 

问题:获取 "自己 "的订单票数组

答案: (续)

如果你想让你的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;   
}

在上述关于票据信息收集的例子中,这些信息在绝大多数情况下是足够的。但在更复杂的系统中,没有人禁止你在票据阵列中存储有关信息,例如,如果在你的专家顾问中实现了虚拟停止。

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。这在常见问题中是绝对不允许的。

建议另一个选项。 为需要与 "自己的 "订单一起工作的人。
 
我不建议这样做。更多的时候,根本就不需要一系列的票据。而正确的做法是,我认为,总是向航站楼索取尽可能多的最新信息。