MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 122

 

이전 질문에 추가하기로 결정했습니다.

하나)

내가 신호를 가지고 있다고 가정해 봅시다 - 스프레드의 급격한 확장과 함께 (뉴스에서)

모든 현재 거래를 닫습니다

그러나 뉴스에서는 주문을 그렇게 닫거나 열 수 없습니다.

따라서 명령을 받으면 OrderClose를 루프 + Sleep (3000)에 넣고 닫힐 때까지 실행합니다.

2)

버튼에 내부 변수를 묶고 눌린/누른 값을 주문을 열 가능성에 묶으면 실시간으로 작동합니까?

 
trader781 :

이전 질문에 추가하기로 결정했습니다.

하나)

내가 신호를 가지고 있다고 가정해 봅시다 - 스프레드의 급격한 확장과 함께 (뉴스에서)

모든 현재 거래를 닫습니다

그러나 뉴스에서는 주문을 그렇게 닫거나 열 수 없습니다.

따라서 명령을 받으면 OrderClose를 루프 + Sleep(3000)에 넣고 닫힐 때까지 실행합니다.

2)

버튼에 내부 변수를 묶고 눌린/누른 값을 주문을 열 가능성에 묶으면 실시간으로 작동합니까?

1) 절전 모드 (3000) 및 오류 처리를 돕지 않습니다.
 

안녕하세요, 차트 에 주문 내역 을 그리는 지표를 작성 중입니다. 코드는 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

extern int         MagicNumber                = 1110 ;
extern datetime    HistoryOrdersFromDateTime  = 0 ;
extern color       SellColor                  = clrRed ;
extern color       BuyColor                   = clrBlue ;
extern color       ProfitColor                = clrWhite ;
extern bool        DeleteHistoryOrders        = false ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
  
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
      {
         if (HistoryOrdersFromDateTime< OrderCloseTime ())
         {
             if (( TimeCurrent ()- OrderCloseTime ())> 60 )
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b= OrderOpenPrice (), d= OrderClosePrice (), lots= OrderLots (), Profit= 0 ;
   datetime a= OrderOpenTime (), c= OrderCloseTime (), close_time;
   string Ticket=( string ) OrderTicket (), type= "Sell" , symbol= OrderSymbol (), comment= OrderComment (), Background;
   color col=SellColor;
   if ( OrderType ()== 0 ) {col=BuyColor; type= "Buy" ;}

   if (DeleteHistoryOrders== false )
   {
       //Начальная точка
       ObjectCreate ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJ_ARROW , 0 ,a,b);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJPROP_ARROWCODE , 1 );
      
       //Линия  
       ObjectCreate ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJ_TREND , 0 ,a,b,c,d);
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_WIDTH , 1 );
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_STYLE , STYLE_DOT );
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_RAY , 0 );
  
       //Конечная точка
       ObjectCreate ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJ_ARROW , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJPROP_ARROWCODE , 3 );

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               Ticket=( string ) OrderTicket ();
            }  
         }      
      }
      
       //Размер фона  
       for ( int i= 2 ; i< StringLen ( DoubleToString (Profit, 2 )); i++)
         StringAdd (Background, "g" );
      
       //Фон профита
       ObjectCreate ( "#" +Ticket+ " Background" , OBJ_TEXT , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_ANCHOR , ANCHOR_LOWER );
       ObjectSetText ( "#" +Ticket+ " Background" ,Background, 10 , "Webdings" ,col);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_PRICE1 ,d);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_TIME1 ,c+ Period ());
  
       //Профит
       ObjectCreate ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJ_TEXT , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_ANCHOR , ANCHOR_LOWER );
       ObjectSetText ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), DoubleToString (Profit, 2 ), 10 , "Arial" ,ProfitColor);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_PRICE1 ,d);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_TIME1 ,c+ Period ());
   } else ObjectsDeleteAll ( 0 , "#" +Ticket+ " " );  
}

void OnDeinit ( const int reason)
{  
   //Удалаение истории ордеров
   for ( int i= 0 ; i< OrdersHistoryTotal (); i++)
   {
      DeleteHistoryOrders= true ;
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol ())
         HistoryOrders();
   }
}

표시기는 단일 거래를 올바르게 그립니다(선>배경>이익), 그러나 닫힌 주문 그리드의 표시에는 작은 "캔트"(스크린샷 첨부)가 있고, 선은 배경과 이익(선(1)>배경에 겹쳐짐)이 있습니다. >이익>선(2) >선(3)>선(4) ... ).

(line(1)>line(2)>line(3)>line(4) ... >background>profit)과 같아야 합니다. 탬버린과 함께하는 다양한 춤은 성공으로 이어지지 않았고 마무리하는 데 도움이되었습니다.

파일:
 
ilnur17021992 :

안녕하세요 주문내역을 차트에 그리는 지표를 쓰고 있는데요 ,


표시기는 단일 거래를 올바르게 그립니다(라인>배경>이익), 그러나 닫힌 주문 그리드 표시에는 작은 "캔트"가 있고(스크린샷 첨부), 선은 배경과 이익에 겹쳐집니다(라인(1)> 배경>이익>선(2) >선(3)>선(4) ... ).

(line(1)>line(2)>line(3)>line(4) ... >background>profit)과 같아야 합니다. 탬버린과 함께하는 다양한 춤은 성공으로 이어지지 않았고 마무리하는 데 도움이되었습니다.

OBJPROP_BACK 속성을 배경의 라인과 아이콘에 할당하십시오.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov :
OBJPROP_BACK 속성을 배경의 라인과 아이콘에 할당하십시오.
선택 사항이 아니므로 선이 배경(촛불 뒤)에 있지만 그림이 초 위에 있어야 합니다. 양초>선>이익 배경>이익
파일:
 
ilnur17021992 :
선택 사항이 아니므로 선이 배경(촛불 뒤)에 있지만 그림이 초 위에 있어야 합니다. 양초>선>이익 배경>이익
그런 다음 플로팅 시퀀스만 하면 됩니다. 또는 배경과 이익을 그릴 때 시간별로 이러한 객체의 존재를 확인 하고 OBJ_TEXT 객체 에서 이익 값을 읽고 현재 주문의 이익에 추가하십시오. 그런 다음 배경과 이익을 삭제하고 다시 그립니다.
그건 그렇고, 이것은 이익 계산을위한 추가주기에서 당신을 구할 것입니다.

이 하나
       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               Ticket=( string ) OrderTicket ();
            }  
         }      
      }
나머지 주문 매개변수와 함께 처음에 이익을 결정합니다.

p.s 제발. 이 버튼을 사용하여 사진 게시
 
Alexey Viktorov :
그런 다음 플로팅 시퀀스만 하면 됩니다. 또는 배경과 이익을 그릴 때 시간별로 이러한 객체의 존재를 확인 하고 OBJ_TEXT 객체 에서 이익 값을 읽고 현재 주문의 이익에 추가하십시오. 그런 다음 배경과 이익을 삭제하고 다시 그립니다.
그건 그렇고, 이것은 이익 계산을위한 추가주기에서 당신을 구할 것입니다.
나머지 주문 매개변수와 함께 처음에 이익을 결정합니다.

그러한 그리기 순서를 설정하는 방법, 먼저 모든 점과 그들을 연결하는 선을 그린 다음 배경 및 이익 그리기를 진행한다고 가정 해 봅시다.

 
ilnur17021992 :

그러한 그리기 순서를 설정하는 방법, 먼저 모든 점과 그들을 연결하는 선을 그린 다음 배경 및 이익 그리기를 진행한다고 가정 해 봅시다.

글쎄, 내 첫 번째 가정에 따르면 그렇습니다. 그리고는 곧바로 즉흥적으로 번쩍번쩍 번쩍 떠서 첫 번째 문장은 지우지 않았지만 두 번째 문장이 더 마음에 든다.

이 옵션을 고려하는 것이 좋습니다.

나중에 개체찾기 () 개체가 발견되면 ObjectGetString () 텍스트에서 숫자로 전송, 수신된 주문에 마지막 주문의 이익을 추가하고 사용되지 않는 OBJ_TEXT를 삭제하고 새 주문을 그립니다.
이것이 이 막대에서 마감된 첫 번째 또는 유일한 주문인 경우
OBJ_TEXT 가 간단히 그려지고 그게 끝입니다.
그리고 이름을 단순화하기 위해 티켓이 아닌 바 의 오픈 시간을 설정하십시오. 아니면 추가 작업에 티켓이 필요한가요?

 
Alexey Viktorov :
글쎄, 내 첫 번째 가정에 따르면 그렇습니다. 그리고는 곧바로 즉흥적으로 번쩍번쩍 번쩍 떠서 첫 번째 문장은 지우지 않았지만 두 번째 문장이 더 마음에 든다.

이 옵션을 고려하는 것이 좋습니다.

나중에 개체찾기 () 개체가 발견되면 ObjectGetString () 텍스트에서 숫자로 전송, 수신된 주문에 마지막 주문의 이익을 추가하고 사용되지 않는 OBJ_TEXT를 삭제하고 새 주문을 그립니다.
이것이 이 막대에서 마감된 첫 번째 또는 유일한 주문인 경우
OBJ_TEXT 가 간단히 그려지고 그게 끝입니다.
그리고 이름을 단순화하기 위해 티켓이 아닌 바 의 오픈 시간을 설정하십시오. 아니면 추가 작업에 티켓이 필요한가요?

예, 이 티켓은 이후의 기록 분석에 필요합니다. 다시 그리기를 눌러주셔서 감사합니다. 다음 검사를 추가하고 코드에 다시 그려서 문제를 조금 더 쉽게 해결했습니다.

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               ProfitTicket=( string ) OrderTicket ();
               CountOrders++;
            }  
         }      
      }
      
       //Перерисовка фона и профита
       if ( CountOrders > 1 )
      {  
         ObjectDelete ( "#" +Ticket+ " Background" );
         ObjectDelete ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ));
         Ticket=ProfitTicket;      
      }

이것이 얼마나 정확한지는 모르겠지만 원칙적으로 그것은 그래야만 하는 대로 그립니다(선> 배경> 이익):

 
ilnur17021992 :

예, 이 티켓은 이후의 기록 분석에 필요합니다. 다음 검사를 추가하고 코드에 다시 그려서 문제를 조금 더 쉽게 해결했습니다.

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               ProfitTicket=( string ) OrderTicket ();
               CountOrders++;
            }  
         }      
      }
      
       //Перерисовка фона и профита
       if ( CountOrders > 1 )
      {  
         ObjectDelete ( "#" +Ticket+ " Background" );
         ObjectDelete ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ));
         Ticket=ProfitTicket;      
      }

원칙적으로 올바르게 그립니다(선> 배경> 이익):

잘됐네요. 다행입니다.