FAQ 작성에 대한 Subbotnik(자주 묻는 질문). 동료들을 도우자! - 페이지 13

 
즉시 실행과 시장 실행의 차이점은 무엇입니까?

( Integer ): Instant Executuion을 사용하면 미리 설정된 손절매와 이익으로 주문을 열 수 있으며 허용 편차(Slippage)를 포인트 단위로 설정합니다. 브로커에 의한 실행이 거래자의 요청 가격과 다릅니다. Market Execution을 사용하면 미리 설정된 손절매로 주문을 개설하거나 이익을 얻을 수 없으며 허용되는 슬리피지 매개변수(Slippage)가 없습니다. 주문은 브로커가 주문을 실행하는 순간에 사용 가능한 모든 가격으로 개설됩니다. 손절매 및/또는 이익실현은 개설 직후에 주문할 수 있습니다. 대부분의 거래 센터는 즉시 실행 모드에서 작동합니다. 시장 실행 모드에서 운영되는 거래 센터는 많지 않습니다.
 
점점 더 많은 DC가 Market Execution 으로 전환하고 있습니다. 곧 Integer가 제공한 정보는 무의미해질 것입니다.
 
joo :
점점 더 많은 DC가 Market Execution으로 전환하고 있습니다. 곧 Integer가 제공한 정보는 무의미해질 것입니다.

이것은 두 가지 모드에 대한 정보일 뿐입니다.

그리고 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. 하나의 통화 쌍에 대한 티켓 정보 수집.
 // Сначала объявляем массив в глобальных переменных
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);

Expert Advisor가 다중 통화인 경우.
예 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);   
}
 

질문: "자신의" 주문 티켓 배열 가져오기

답변: (계속)

Expert Advisor에서 작업에 대한 추가 통계(예: 최대 손실, 총 이익 등)를 원하는 경우 놀라운 일이 아닙니다. 다시 한 번 요청으로 서버를 "방해"하지 않으려면 기능에 기능을 추가하는 것이 편리합니다(말장난 죄송합니다). 그러면 함수는 다음과 같이 보일 수 있습니다.

단일 통화 고문을 위한 옵션 번호 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 ;   
}

티켓에 대한 정보를 수집하는 주어진 예에서 이 정보는 대부분의 경우에 충분합니다. 그러나 아무도 티켓 배열에 더 복잡한 시스템에 저장하는 것을 금지하지 않습니다. 예를 들어 EA에 가상 정류장이 있는 경우 이에 대한 정보는 다음과 같습니다.

 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. 이것은 결코 FAQ에 없습니다.

다른 옵션을 제공합니다. "그들의" 명령으로 작업할 필요가 있기 때문에
 
나는 제안하지 않을 것이다. 대부분의 경우 일련의 티켓이 전혀 필요하지 않습니다. 그리고 가장 정확한 IMHO는 항상 단말기에 최신 정보를 요청하는 것입니다.