초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 51

 

숙련된 프로그래머의 도움이 필요합니다!

안녕하세요 여러분!

여러분, 여러분의 도움이 필요합니다! 나는 나 자신에게 한 조언자를 씁니다. 제가 프로그래밍을 잘 못해서 여쭤봅니다. 일반적으로 시장가 주문에 대한 잠금을 설정하는 테스트 기능을 수행하고 있습니다. 모든 주문은 구조적 2차원 배열에 입력됩니다. 배열 [0]의 첫 번째 인덱스(셀)는 기본(시장) 주문이고 두 번째 인덱스(셀) [1]은 기본 주문에 대한 잠금입니다. 따라서 함수는 잠금이 기본 순서로 설정되어 있는지 확인해야 하며 - YES이면 아무것도 하지 않고 추가 작업을 수행하고 - NO이면 해당 잠금을 설정하라는 신호를 보냅니다. 함수를 작성했지만 어떻게 든 비뚤어진 작동합니다. 즉, 예를 들어 시장 매수 주문이 열리면 단말기는 이 주문 유형 이 BUY가 아니라 SELL임을 나타내므로 이에 대해 잠금이 설정되어야 합니다. 그리고 SELL 주문을 사용하면 모든 것이 올바르게 작동합니다. 나는 아무것도 이해할 수 없다. 주문이 배열에 올바르게 기록됩니다. 해당 확인을 수행했습니다. 모든 것이 완벽합니다. 배열의 모든 주문 기준이 올바르게 반영됩니다. 코드에서 오류를 찾거나 내 기능을 어떻게든 다시 만들 수 있도록 도와주세요. 기능을 첨부합니다.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
bool CheckOrders()                                                                               // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
  {                                                                                             // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
   int     TypeOrder;
   string Type          = "" ,
          OrderComm     = "" ;
   bool    OpenLockOrder = false ;                                                                 // Флаг на установку лок ордера      
  
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)                                                           // Выполняем перебор по рыночн. и отлож. ордерам
     {
       if (( OrderSelect (i, SELECT_BY_POS ) == true )                                                 // Если есть следующ.
      && ( OrderSymbol () == Symbol ()))                                                           // .. и наша вал.пара
        {
         OrderComm = OrderComment ();                                                             // Выбираем соответствующий комментарий ордера
         TypeOrder = OrderType ();                                                               // Выбираем соответствующий тип ордера                                                          
         for ( int n= 0 ; n<= 199 ; n++)                                                               // Выполняем прогон по массиву ордеров
            {  
             if ( StringFind (OrderComm, "BaseIndex #" + IntegerToString (n)+ "_" , 0 )>= 0 )                 // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
               {
                 if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_BUY )                       // Если находим и наш ордер в массиве является BUY
                  {
                   if (InfoOrderNew[ 1 ][n].TypeOrder == 1 || InfoOrderNew[ 1 ][n].TypeOrder == 5 )   // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
                     {
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 1 ) Type = "Sell" ;
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 5 ) Type = "SellStop" ;
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Buy #" ,InfoOrderNew[ 0 ][n].TicketOrder, " найден Lock-ордер " ,Type, " #" ,InfoOrderNew[ 1 ][n].TicketOrder, "." );
                       break ;                                                                     // Если лок выставлен, то выходим из функции
                     }
                   else                                                                          // Если нет, то
                     {
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Buy #" ,InfoOrderNew[ 0 ][n].TicketOrder, " не найден Lock-ордер. Необходимо его установить!" );
                      OpenLockOrder = true ;                                                     // Даем сигнал на установку лока
                     }
                  }  
                 if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_SELL )                       // Если наш ордер в массиве является SELL
                  {  
                   if (InfoOrderNew[ 1 ][n].TypeOrder == 0 || InfoOrderNew[ 1 ][n].TypeOrder == 4 )   // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
                     {
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 0 ) Type = "Buy" ;
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 4 ) Type = "BuyStop" ;
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Sell #" ,InfoOrderNew[ 0 ][n].TicketOrder, " найден Lock-ордер " ,Type, " #" ,InfoOrderNew[ 1 ][n].TicketOrder, "." );
                       break ;                                                                     // Если лок выставлен, то выходим из функции
                     }
                   else                                                                          // Если нет, то
                    {
                     if (Debug) Print ( "Функция CheckOrders(): К ордеру Sell #" ,InfoOrderNew[ 0 ][n].TicketOrder, " не найден Lock-ордер. Необходимо его установить!" );
                     OpenLockOrder = true ;                                                       // Даем сигнал на установку лока
                    }
                  }    
               }
            }
        }
     }
   return (OpenLockOrder);                                                                       // Передаем нашей функции полученное значение  
  }
 
Сергей :

숙련된 프로그래머의 도움이 필요합니다!

안녕하세요 여러분!

여러분, 여러분의 도움이 필요합니다! 나는 나 자신에게 한 조언자를 씁니다. 제가 프로그래밍을 잘 못해서 여쭤봅니다. 일반적으로 시장가 주문에 대한 잠금을 설정하는 테스트 기능을 수행하고 있습니다. 모든 주문은 구조적 2차원 배열에 입력됩니다. 배열 [0]의 첫 번째 인덱스(셀)는 기본(시장) 주문이고 두 번째 인덱스(셀) [1]은 기본 주문에 대한 잠금입니다. 따라서 함수는 잠금이 기본 순서로 설정되어 있는지 확인해야 하며 - YES이면 아무것도 하지 않고 추가 작업을 수행하고 - NO이면 해당 잠금을 설정하라는 신호를 보냅니다. 함수를 작성했지만 어떻게 든 비뚤어진 작동합니다. 즉, 예를 들어 시장 매수 주문이 열리면 단말기는 이 주문 유형 이 BUY가 아니라 SELL임을 나타내므로 이에 대해 잠금이 설정되어야 합니다. 그리고 SELL 주문을 사용하면 모든 것이 올바르게 작동합니다. 나는 아무것도 이해할 수 없다. 주문이 배열에 올바르게 기록됩니다. 해당 확인을 수행했습니다. 모든 것이 완벽합니다. 배열의 모든 주문 기준이 올바르게 반영됩니다. 코드에서 오류를 찾거나 내 기능을 어떻게든 다시 만들 수 있도록 도와주세요. 기능을 첨부합니다.

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
bool CheckOrders()                                                                               // Есть массив с базовыми ордерами, открытыми по рынку InfoOrderNew[0][200]
  {                                                                                             // Есть массив с лок ордерами, выставленными к базовым InfoOrderNew[1][200]
   int     TypeOrder;
   string Type          = "" ,
          OrderComm     = "" ;
   bool    OpenLockOrder = false ;                                                                 // Флаг на установку лок ордера      
  
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)                                                           // Выполняем перебор по рыночн. и отлож. ордерам
     {
       if (( OrderSelect (i, SELECT_BY_POS ) == true )                                                 // Если есть следующ.
      && ( OrderSymbol () == Symbol ()))                                                           // .. и наша вал.пара
        {
         OrderComm = OrderComment ();                                                             // Выбираем соответствующий комментарий ордера
         TypeOrder = OrderType ();                                                               // Выбираем соответствующий тип ордера                                                          
         for ( int n= 0 ; n<= 199 ; n++)                                                               // Выполняем прогон по массиву ордеров
            {  
             if ( StringFind (OrderComm, "BaseIndex #" + IntegerToString (n)+ "_" , 0 )>= 0 )                 // Ищем базовый ордер с индексом в комментарии, соответствующем номеру ячейки в массиве ордеров
               {
                 if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_BUY )                       // Если находим и наш ордер в массиве является BUY
                  {
                   if (InfoOrderNew[ 1 ][n].TypeOrder == 1 || InfoOrderNew[ 1 ][n].TypeOrder == 5 )   // Проверяем, выставлен ли к нему лок ордер (SELL или SELLSTOP) в массиве лок ордеров
                     {
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 1 ) Type = "Sell" ;
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 5 ) Type = "SellStop" ;
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Buy #" ,InfoOrderNew[ 0 ][n].TicketOrder, " найден Lock-ордер " ,Type, " #" ,InfoOrderNew[ 1 ][n].TicketOrder, "." );
                       break ;                                                                     // Если лок выставлен, то выходим из функции
                     }
                   else                                                                          // Если нет, то
                     {
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Buy #" ,InfoOrderNew[ 0 ][n].TicketOrder, " не найден Lock-ордер. Необходимо его установить!" );
                      OpenLockOrder = true ;                                                     // Даем сигнал на установку лока
                     }
                  }  
                 if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_SELL )                       // Если наш ордер в массиве является SELL
                  {  
                   if (InfoOrderNew[ 1 ][n].TypeOrder == 0 || InfoOrderNew[ 1 ][n].TypeOrder == 4 )   // Проверяем, выставлен ли к нему лок ордер (BUY или BUYSTOP) в массиве лок ордеров
                     {
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 0 ) Type = "Buy" ;
                       if (InfoOrderNew[ 1 ][n].TypeOrder == 4 ) Type = "BuyStop" ;
                       if (Debug) Print ( "Функция CheckOrders(): К ордеру Sell #" ,InfoOrderNew[ 0 ][n].TicketOrder, " найден Lock-ордер " ,Type, " #" ,InfoOrderNew[ 1 ][n].TicketOrder, "." );
                       break ;                                                                     // Если лок выставлен, то выходим из функции
                     }
                   else                                                                          // Если нет, то
                    {
                     if (Debug) Print ( "Функция CheckOrders(): К ордеру Sell #" ,InfoOrderNew[ 0 ][n].TicketOrder, " не найден Lock-ордер. Необходимо его установить!" );
                     OpenLockOrder = true ;                                                       // Даем сигнал на установку лока
                    }
                  }    
               }
            }
        }
     }
   return (OpenLockOrder);                                                                       // Передаем нашей функции полученное значение  
  }

전에 시도
if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_SELL )
다른 것을 넣어

또는 출력 로그를 표시합니다.
 
Vladislav Andruschenko :

전에 시도
if ((TypeOrder == InfoOrderNew[ 0 ][n].TypeOrder) == OP_SELL )
다른 것을 넣어

또는 출력 로그를 표시합니다.

놓다. 아무것도 바뀌지 않았다. 다음은 이벤트 로그의 항목입니다.

2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция SendMarketOrder(): Торговля разрешена, отправляем ордер...
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: open # 1 buy 0.10 GBPUSD at 1.23020 ok
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция SendMarketOrder(): Ордер отправлен успешно! Характеристики ордера: Buy # 1 ; Цена открытия: 0.0 ; Лот: 0.1 ; Стоплосс: 0.0 ; Тейкпрофит: 0.0 .
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: В работе функция ModifyOrder()
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder()
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Торговый поток свободен!
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: modify # 1 buy 0.10 GBPUSD at 1.23020 sl: 1.18020 tp: 1.23520 ok
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция ModifyOrder(): Модификация ордера выполнена успешно!
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: В работе функция SetPendingOrder()
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Выставленная цена SellStop ордера удовлетворяет условиям брокера.
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: open # 2 sell stop 0.10 GBPUSD at 1.22020 ok
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция SetPendingOrder(): Отложенный ордер выставлен c 1 -й попытки! Характеристики ордера: SellStop # 2 ; Цена: 1.2202 ; Лот: 0.1 .
2017.01 . 15 18 : 23 : 51.062 2017.01 . 03 04 : 15 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Отложенный SellStop ордер успешно установлен!
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет # 2 ; Цена= 1.2202 ; Тип= 5 ; ячейка[ 0 ].
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет # 1 ; Цена= 1.2302 ; Тип= 0 ; ячейка[ 0 ].
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 2 .
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 1 .
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 1 .
2017.01 . 15 18 : 23 : 51.109 2017.01 . 03 04 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell # 1 не найден Lock-ордер. Необходимо его установить!
 
InfoOrderNew[ 1 ][n].TypeOrder 배열을 채우는 함수를 보십시오.
 
Vladislav Andruschenko :
InfoOrderNew[ 1 ][n].TypeOrder 배열을 채우는 함수를 보십시오.
배열 채우기 함수는 모든 데이터를 올바르게 반환합니다. 잡지에서 세포가 어떻게 채워지는지 보여줄 수 있습니다. 우리는 시장 주문 매수 #1을 엽니다. 매도 중지 #2 잠금이 설정됩니다. 다음으로 Sell#3 시장가 주문이 열리고 그 옆에 BuyStop#4 잠금이 설정됩니다. 이러한 모든 작업은 이벤트 로그에 반영됩니다. Buy#1 주문이 Sell 주문의 루프에 어떻게 들어가는지 궁금합니다! 어떻게 이럴 수있어? 여기에 해당하는 잠금 순서가 없다는 오류가 발생합니다. 그러나 이것은 Sell#3 주문에는 적용되지 않습니다. 거기에서 로컬 검사 기능은 올바른 결과를 제공합니다. 여기에서 직접 로그 보고서를 살펴보십시오.
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет # 4 ; Цена= 1.2387 ; Тип ордера=BuyStop; ячейка[ 1 ].
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет # 3 ; Цена= 1.2287 ; Тип ордера=Sell; ячейка[ 1 ].
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива Lock-ордерами. Ордер Тикет # 2 ; Цена= 1.2202 ; Тип ордера=SellStop; ячейка[ 0 ].
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Проверка заполнения массива обычными ордерами. Ордер Тикет # 1 ; Цена= 1.2302 ; Тип ордера=Buy; ячейка[ 0 ].
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество найденных ордеров = 4 .
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество рыночных ордеров = 2 .
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00   Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция OpenOrders(): Общее количество Lock-ордеров = 2 .
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00    Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell # 3 найден Lock-ордер BuyStop # 4 .
2017.01 . 15 23 : 09 : 48.234 2017.01 . 03 09 : 30 : 00    Multi-Trade System ver. 1.03 (SergeyOm) GBPUSD,M15: Функция CheckOrders(): К ордеру Sell # 1 не найден Lock-ордер. Необходимо его установить!
 
문제 검색에 참여해 주신 Vladislav Andruschenko 에게 감사드립니다! 나는 그것을 알아 낸 것 같습니다. 코드를 약간 변경해야 했고 모든 것이 즉시 작동했습니다.
 
Сергей :
문제 검색에 참여해 주신 Vladislav Andruschenko 에게 감사드립니다! 나는 그것을 알아 낸 것 같습니다. 코드를 약간 변경해야 했고 모든 것이 즉시 작동했습니다.

별말씀을요

주말에 조금 빠졌어요. :-) 당신이 그것을 알아 냈다는 것이 좋습니다.

 
Vladislav Andruschenko :

별말씀을요

주말에 조금 빠졌어요. :-) 당신이 그것을 알아 냈다는 것이 좋습니다.

또 다른 질문이 나왔습니다.

구조적 이기종 어레이의 셀에서 정보를 재설정하거나 삭제하는 방법은 무엇입니까? 문제는 내가 주석을 순서로 변경했으며 구조적 배열의 셀에서 이 순서를 제거하고 다른 배열에서 이 순서를 정의해야 한다는 것입니다. 일반 배열의 경우 모든 것이 다소 명확하지만 구조적 배열의 경우 어떤 연산자나 함수가 작동하는지 또는 모든 형식을 어떻게 지정해야 하는지 모르겠습니다. 그리고 이전 채우기에 대한 정보를 저장하고 새 채우기와 비교하기 위해 한 구조적 배열을 다른 배열로 복사하는 방법은 무엇입니까? 이에 대해 아는 사람이 있으면 알려주십시오. 나는 매우 감사 할 것입니다!

 
가격 대신 가격 레이블( OBJ_ARROW_LEFT_PRICE )에 자신의 텍스트를 표시할 수 있습니까? 그렇다면 어떻게 합니까?
 
ilnur17021992 :
가격 대신 가격 레이블( OBJ_ARROW_LEFT_PRICE )에 자신의 텍스트를 표시할 수 있습니까? 그렇다면 어떻게 합니까?
안 돼요. 가격 레이블 OBJ_TEXT와 유사한 것을 작성할 수 있습니다.