KimIV의 유용한 기능 - 페이지 86

 

이고르! 말씀해 주시겠어요? 표시기( iMA )의 무언가가 소수점 이하 4자리로 Expert Advisor에 오지만 작동하려면 5가 필요합니다!? 나는 NormalizeDouble(iMA,Digits)을 시도했습니다 - 여전히 4자리. 5자리를 얻으려면 전체 지표를 Expert Advisor의 서브루틴 기능으로 다시 작성해야 합니까?!!!

 

도움말: Alert(), Comment(), Print()

더블 데이터는 도트 뒤에 4자리의 10진수로 출력됩니다.

숫자를 더 정확하게 표시하려면 DoubleToStr() 함수를 사용하십시오.

 

좋은 저녁이에요,

포지션의 정확한 청산을 처리할 수 없습니다. 조건에 따라 두 가지 마감 조건이 있습니다. 1. 한 포지션이 열려 있는 경우; 2. 두 개(또는 그 이상)의 자리가 열려 있는 경우. 두 경우 모두 로트 부피 = 0.03입니다. 첫 번째 경우 로트는 0.01에서 별도로 마감됩니다(위의 게시물에서 확인). 두 번째 경우에는 두 로트가 모두 0.03에서 마감되어야 합니다. 따라서 다음과 같은 경우:

 if ( OrderType ( ) = = OP_BUY & & BuyTotalOp = = 1 )

첫 번째 폐쇄 옵션과 다음과 같은 경우:

 if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )

그런 다음 다른 하나(내 버전에서 (예비) 두 위치의 이익 합계가 0보다 큰 경우 두 위치가 모두 닫혀야 함). 다음과 같이 보입니다.

   extern double Lots = 0.03 ;            // Жестко заданное колич. лотов
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   // Учёт количества имеющихся ордеров
   Symb = Symbol ( ) ;                                // Название фин.инстр.
   BuyTotalOp = 0 ;                                  // Количество Buy ордеров
   SellTotalOp = 0 ;                                // Количество Sell ордеров
   for ( int i = 1 ; i < = OrdersTotal ( ) ; i + + )          // Цикл перебора ордер
       {
       if ( OrderSelect ( i - 1 , SELECT_BY_POS ) = = true ) // Если есть следующий
         {                                        // Анализ ордеров:
         if ( OrderSymbol ( ) ! = Symb ) continue ;        // Не наш фин. инструм
         if ( OrderType ( ) > 1 )                      // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." ) ;
             return ;                              // Выход из start()
           }
         if ( OrderType ( ) = = OP_BUY )
           {
            BuyTotalOp + + ;                          // Счётчик ордеров Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   //Проверка если открыто несколько БАЙ-позиций
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия нескольких лотов БАЙ
       if ( BuyOrdProf > 0 )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy
         if ( Ans = = true )                              // Получилось :)
           { 
             Alert ( "Закрыт ордер Buy " , TicketCl ) ;
             break ;                                    // Выход из цикла закр
           }
         if ( Fun_Error ( GetLastError ( ) ) = = 1 )            // Обработка ошибок
             continue ;                                // Повторная попытка
         return ;                                      // Выход из start()
         }
     }
//.........................................
   //Проверка если открыта одна БАЙ-позиция
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp = = 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия одного лота БАЙ
       if ( BUYCLOSE_1PART & & BuyClLot = = Lots )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy
         if ( Ans = = true )                              // Получилось :)
           { 
             Alert ( "Закрыт ордер Buy " , TicketCl ) ;
             break ;                                    // Выход из цикла закр
           }
         if ( Fun_Error ( GetLastError ( ) ) = = 1 )            // Обработка ошибок
             continue ;                                // Повторная попытка
         return ;                                      // Выход из start()
         }
 

실제로 두 로트의 청산 조건이 나타나면 첫 번째 로트가 완전히 닫히고 두 번째 로트가 BuyTotalOp==1 청산 조건을 "인계"하여 자체 조건에 따라 닫히는 것으로 나타났습니다.

마감 조건에서 무엇이 잘못되었으며 두 로트를 동시에 강제로 마감하는 방법을 알려주십시오. 미리 감사드립니다.

 
나는 OrderTicket ()과 Lot를 모두 계산하고 주문 루프에 추가하려고 시도했습니다 - 아무 소용이 없습니다 ... 아마도 항상 그렇듯이 "진실은 근처 어딘가에 있습니다"하지만 잡히지 않습니다 ...
 

파리를 커틀릿에서 분리하십시오.. 유용한 기능을 작성하십시오..

예를 들어 주문 유형별 개설 주문 수, 주문 유형별 마감 주문 수 등을 계산합니다.

그러면 모든 것이 더 쉬워질 것입니다.

 if ( ordersTotal ( SYMBOL , OP_BUY ) = = 1 ) closeAllOrders ( SLIPPAGE , TRY , TRADESLEEP , SHOWERRORS , SYMBOL , OP_BUY ) ;
if ( ordersTotal ( SYMBOL , OP_BUY ) > 1 ) closeAllOrders ( SLIPPAGE , TRY , TRADESLEEP , SHOWERRORS , SYMBOL , OP_BUY ) ;

그렇지 않으면 어딘가에 충분하지 않습니다 } 그리고 일반적으로 정확히 무엇을 수행하고 있는지 명확하지 않습니다 .. 동시에 주문 수를 계산하고 즉시 삭제하려고합니까, 아니면 무엇입니까? 보류 중인 주문은 사용 가능한 경우 코드를 중단하는 것보다 건너뛰는 것이 합리적일 수 있습니까?

좋은 옵션은 주어진 조건에 따라 열린 주문의 매개 변수가 있는 배열을 형성하고 이를 통해 실행할 수 있는 기능입니다. 일반적으로 구조에서 작업 ..

 

감사합니다 keekkenen, 최근에 어레이를 만드는 것에 대해 생각하고 있습니다. 나는 그와 함께 일한 적이 없으며 더 간단한 해결책이 있기를 바랐습니다. 나는 이미 "깜빡한"모습을했고 신선한 눈을 가진 누군가가보고 나서 "예, 크리스마스 트리, 그러나 당신은 어디에 이런 것이 있습니까? 계산..." 결국, 한 주기의 모든 구매 주문 수가 있습니다.

   // Учёт количества имеющихся ордеров от начала к концу
   Symb = Symbol ( ) ;                                // Название фин.инстр.
   BuyTotalOp = 0 ;                                  // Количество Buy ордеров
   SellTotalOp = 0 ;                                // Количество Sell ордеров
   for ( int i = 1 ; i < = OrdersTotal ( ) ; i + + )          // Цикл перебора ордер
       {
       if ( OrderSelect ( i - 1 , SELECT_BY_POS ) = = true ) // Если есть следующий
         {                                        // Анализ ордеров:
         if ( OrderSymbol ( ) ! = Symb ) continue ;        // Не наш фин. инструм
         if ( OrderType ( ) > 1 )                      // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." ) ;
             return ;                              // Выход из start()
           }
         if ( OrderType ( ) = = OP_BUY )
           {
            BuyTotalOp + + ;                          // Счётчик ордеров Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

그리고 OrderClose 는 그들을 따르지 않습니다 ...

   //Проверка если открыто несколько БАЙ-позиций
   if ( OrderType ( ) = = OP_BUY & & BuyTotalOp > 1 )          // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
       //---- если условия закрытия нескольких лотов БАЙ
       if ( BuyOrdProf > 0 )
         {
         //---- закрываем 1-ю часть позиции
         Alert ( "Попытка закрыть Buy " , TicketCl , ". Ожидание ответа.." ) ;
         RefreshRates ( ) ;                              // Обновление данных
         Ans = OrderClose ( CloseTicketCl , BuyTotalOp , Bid , 0 , Red ) ;            // Закрытие Buy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
글쎄요, 이건 분명히 "지혜"입니다........
 

그리고 솔직히 말해서, 나는 이것을 이해하지 못합니다.

Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy

그리고 이것은 특히 로트를 3으로 나누는 것 ?? 주문이 열렸을 때와 동일한 로트로 마감되었습니다.

Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy

두 경우 모두 왜 안되지?

Ans = OrderClose (OrderTicket() ,OrderLots() ,OrderClosePrice() , 0 , Red ) ;            // Закрытие Buy
 

두 경우 모두 왜 안되지?

Ans = OrderClose (OrderTicket() ,OrderLots() ,OrderClosePrice() , 0 , Red ) ;            // Закрытие Buy

CloseTicketCl = OrderTicket () 일반적으로 다음을 수행할 수 있습니다.

그리고 이것은 특히 로트를 3으로 나누는 것 ?? 주문이 열렸을 때와 동일한 로트로 마감되었습니다.

 Ans = OrderClose ( CloseTicketCl , LotCloseBuy / 3 , Bid , 0 , Red ) ;            // Закрытие Buy

동일하지 않습니다. 로트의 1/3이 닫힙니다(조건 중 하나에 따라 - 가격이 +150pp에 도달했다고 가정해 봅시다). 두 번째 1/3은 예를 들어 오프닝에서 +300pp가 되면 닫힙니다.

그리고 솔직히 말해서, 나는 이것을 이해하지 못합니다.

 Ans = OrderClose ( CloseTicketCl , Lots , Bid , 0 , Red ) ;            // Закрытие Buy
여기에 Lot와 OrderLots() 예, 같은 것입니다.
 
hope >> : 같지 않습니다. 로트의 1/3이 닫힙니다(조건 중 하나에 따라 - 가격이 +150pp에 도달했다고 가정해 봅시다). 두 번째 1/3은 예를 들어 오프닝에서 +300pp가 되면 닫힙니다.

아니오, 그것은 작동하지 않습니다.. 하나의 주문 - 하나의 로트, 로트 3으로 주문을 열면 원하는대로 로트를 나눌 수 없습니다 - 처음 1, 1, 1 - 주문이 완전히 마감되었습니다 , 즉, 주문이 개설된 동일한 로트로 마감되었습니다. 부분적으로 주문을 마감할 수 없습니다.