Un subtaller para completar las FAQ (preguntas frecuentes). ¡Ayudemos a los compañeros! - página 13

 
¿Cuál es la diferencia entre la ejecución instantánea y la ejecución de mercado?

(Entero ): Con Instant Executuion, se puede abrir una orden con un stop-loss y take-profit preestablecidos, establecer el Slippage en pips, que permite abrir una orden cuando el precio en el momento de su ejecución por el broker se desvía del precio de solicitud del trader. En la Ejecución de Mercado no es posible abrir una orden con un Stop Loss y/o Take Profit predeterminado, no hay parámetro para el Deslizamiento. La orden se abre a cualquier precio disponible en el momento de su ejecución por el corredor. Se puede establecer un Stop Loss y/o Take Profit inmediatamente después de abrir la orden. La mayoría de los centros de negociación trabajan en el modo de ejecución instantánea. No son muchos los centros de negociación que operan en la modalidad de Ejecución de Mercado.
 
Cada vez son más las empresas de corretaje que se pasan a la ejecución de mercado. Pronto la información dada por Integer será irrelevante.
 
joo:
Cada vez son más las empresas de corretaje que se pasan a la ejecución de mercado. Pronto la información dada por Integer será irrelevante.

es sólo información sobre los dos modos.

y eso es exactamente lo que dice el último párrafo de las FAQ: ¡una tendencia! https://www.mql5.com/ru/forum/131853/page3#464977

-------

Por cierto, ¿cómo es el glosario de términos, está el paciente más bien vivo?

Archivos adjuntos:
mql4_10.zip  419 kb
 
sergeev:

1. y el último párrafo de las preguntas frecuentes dice exactamente eso: ¡tendencia! https://www.mql5.com/ru/forum/131853/page3#464977

-------

2. Por cierto, ¿cómo es el glosario de términos, está el paciente más bien vivo?

1. No vi el último párrafo de las FAQ en el enlace y sólo reaccioné al post de granit77.

2. He leído la sección en la que ofrecí mi propia ayuda. Pero es tan completo como uno podría desear. No hay prácticamente nada que añadir. Debería haber denunciado antes; me arrepiento de no haberlo hecho.

Aun así, la sección puede añadir abreviaturas de jerga de los términos que utilizan los programadores y los comerciantes. Acabo de empezar un nuevo trabajo y ahora tengo muy poco tiempo libre, apenas el suficiente para al menos continuar con mi propio proyecto. Por lo tanto, iré anotando poco a poco "en un papel" y cuando acumule más, lo añadiré a la sección. ¿DE ACUERDO?

 
joo:

ok
 

Pregunta: Obtención de una matriz de órdenes "propias"

Respuesta: Desde el punto de vista de la optimización del código, este es el enfoque conveniente: primero, realizamos la "revisión" de las órdenes "amigables" (es decir, las órdenes con el MagicNumber() dado), creamos una matriz de tickets con la información completa relativa a cada ticket, y luego realizamos todas las demás comprobaciones (para cerrar y modificar las posiciones) con la misma matriz de tickets.
Ejemplo 1. Recopilación de información sobre las entradas en un par de divisas.
// Сначала объявляем массив в глобальных переменных
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;   
}

Si quieres, puedes declarar esta función de tipo int y hacer que devuelva el número de "órdenes propias".

gi_cnt_Tickets = fMyTickets (gda_Tickets, Magic);

Si nuestro EA es multidivisa.
Ejemplo 2. Recopilación de información sobre los billetes de varios pares de divisas.

Para comprobar los símbolos "amigables" en este caso, necesitaremos una pequeña función más:

//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);
} 

y nuestra función tendrá esta forma:

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

Pregunta: Obtención de una matriz de tickets de pedido "propios"

Respuesta: (Continuación)

No es de extrañar si quieres que tu EA tenga estadísticas adicionales sobre su trabajo, por ejemplo: el drawdown máximo, el beneficio total, etc. Para no tener que "molestar" al servidor con peticiones adicionales, le recomendamos que añada funcionalidad a nuestra función (perdone el juego de palabras). En este caso, la función puede tener el siguiente aspecto

Variante #1 para un EA de monocurrency:

// Объявляем массив в глобальных переменных
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;   
}

Variante #2 para multidivisas:

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

En los ejemplos anteriores sobre la recopilación de información sobre los billetes, esta información es suficiente en la gran mayoría de los casos. Pero en sistemas más complejos, nadie le prohíbe almacenar información sobre ellos en una matriz de entradas, por ejemplo, si se implementan stops virtuales en su Asesor Experto:

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

En general, aquí usted está limitado sólo por el vuelo de la fantasía / fanatismo y el nivel de conocimiento MQL4.

 

TarasBY

Para no "molestar" innecesariamente al servidor con peticiones...

El servidor no es molestado al recoger los pedidos. La ideología de recoger la información de los pedidos en una matriz es UG. Es imposible que esto esté en las FAQ.
 
TheXpert:
El servidor no es molestado al recoger los pedidos. La ideología de recoger la información de los pedidos en una matriz -- UG. Esto no está permitido de ninguna manera en las FAQ.

Sugerir otra opción. para la necesidad de trabajar con órdenes "propias"
 
Yo no lo sugeriría. En la mayoría de los casos, no se necesita una serie de entradas. Y lo correcto, en mi opinión, es pedir siempre al terminal la información más actualizada posible.
Razón de la queja: