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

 

@STARIJ 감사합니다. 시간을 들여 ObjectSet을 작성했습니다! 이것은 오랫동안 작성되었으며 나는 그것을 주석 처리하지 않았으며 코드를 방해하지 않습니다! 잊지 않도록! 당신은 StringSubstr(str,20,7) 을 썼는데, 나는 그것이 모두 리터럴이라고 생각하지 않았습니다! 저녁 식사 후, 나는 그것이 틈새에 있다는 것을 깨달았습니다! 모든 문자와 공백을 세는 것이 필요했습니다! 고마워 친구 야!!!!


 

안녕. mkl4의 또 다른 초보자 질문입니다. 새 막대를 정의하려면 자습서에서 권장하는 사용자 정의 함수 Fun_New_Bar()를 사용합니다.


 void Fun_New_Bar()                               // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time= 0 ;                   // Время текущего бара  
   New_Bar= false ;                               // Нового бара нет  
   if (New_Time!= Time [ 0 ])                         // Сравниваем время  
     {  
      New_Time= Time [ 0 ];                         // Теперь время такое  
      New_Bar= true ;                             // Поймался новый бар  
     }  
  }
그러나 어떤 이유로 항상 작동하지는 않습니다. 삽입된 인쇄 수표:
 if ( Hour ()>= 8 && Hour ()< 20 ) 
      {
      Fun_New_Bar();
       if (New_Bar== false ) Print ( "Нового бара нет" );
       if (New_Bar== true )      
       {     
       RefreshRates ();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

따라서 위치가 새 막대에서 열리 거나 "새 막대가 없습니다"가 인쇄되고 현재 막대에서 위치가 열립니다. 이유를 이해할 수 없습니다. 고맙습니다.

 
novichok2018 :

안녕. mkl4의 또 다른 초보자 질문입니다. 새 막대를 정의하려면 자습서에서 권장하는 사용자 정의 함수 Fun_New_Bar()를 사용합니다.

그러나 어떤 이유로 항상 작동하지는 않습니다. 삽입된 인쇄 수표:

따라서 위치가 새 막대에서 열리 거나 "새 막대가 없습니다"가 인쇄되고 현재 막대에서 위치가 열립니다. 이유를 이해할 수 없습니다. 고맙습니다.

새 막대 와 현재 막대를 어떻게 구별합니까? 코드의 주어진 부분이 얼마나 자주 실행됩니까? 매 틱마다 또는 새 막대 가 형성되는 순간에만 실행됩니까?

 
STARIJ :

새 막대 와 현재 막대를 어떻게 구별합니까? 코드의 주어진 부분이 얼마나 자주 실행됩니까? 매 틱마다 또는 새 막대 가 형성되는 순간에만 실행됩니까?

새 막대 - 기능별. 현재 - 포지션이 마감 되었지만 바의 시간이 만료되지 않았습니다. 코드는 새 막대가 형성될 때 실행되어야 합니다. 또는 오히려 그렇지 않습니다. 위치를 닫기 위한 조건이 정의된 코드 부분은 매 틱마다 실행되고 열기는 새 막대에서 실행됩니다.

 
novichok2018 :

새 막대 - 기능별. 현재 - 포지션이 마감 되었지만 바의 시간이 만료되지 않았습니다. 새 막대가 생성될 때 코드를 실행해야 합니다. 또는 오히려 그렇지 않습니다. 위치를 닫기 위한 조건이 정의된 코드 부분은 매 틱마다 실행되고 열기는 새 막대에서 실행됩니다.

요컨대, 여기에서 모든 것이 명확합니다. 그러나 작성하고 더 정확하게 작성해야 함을 알게되면 커서를 뒤로 되돌려 수정하십시오. 그리고 읽기가 어렵습니다.

코드는 매 틱마다 실행됩니다. 저것들. 질문이 항상 제기됩니다 . 새로운 바가 있습니까? 새로운 바가 있습니까? 새로운 바가 있습니까? 새 막대 가 없다는 메시지가 인쇄될 때마다. 그리고 여기 새로운 바가 있습니다. 주문 오픈? 잘 기다려. 먼저 서버에 명령이 전송됩니다. 틱이 와서 새로운 바가 생길 때까지? 새로운 바가 있습니까? 새 막대 가 없다는 메시지가 인쇄될 때마다 마지막으로 서버가 주문을 열었습니다. 시간을 보고 놀랐습니다. 그리고 주문을 열기 전에 첫 번째 주문 아래 4줄에 Print( TimeCurrent() )를 삽입합니다. 그리고 화면에서 즉시 Alert를 사용 하는 것이 좋습니다. 바로 보실 수 있습니다...

그리고 한 가지 더: if(New_Bar==false) if(New_Bar==true) 대신 if(!New_Bar) if(New_Bar)를 사용할 수 있습니다. 그렇지 않으면 버터를 얻습니다.

 
STARIJ :

요컨대, 여기에서 모든 것이 명확합니다. 그러나 작성하고 더 정확하게 작성해야 함을 알게되면 커서를 뒤로 되돌려 수정하십시오. 그리고 읽기가 어렵습니다.

코드는 매 틱마다 실행됩니다. 저것들. 질문이 항상 제기됩니다 . 새로운 바가 있습니까? 새로운 바가 있습니까? 새로운 바가 있습니까? 새 막대 가 없다는 메시지가 인쇄될 때마다. 그리고 새로운 바가 있습니다. 주문 오픈? 잘 기다려. 먼저 서버에 명령이 전송됩니다. 틱이 와서 새로운 바가 생길 때까지? 새로운 바가 있습니까? 새 막대 가 없다는 메시지가 인쇄될 때마다 마지막으로 서버가 주문을 열었습니다. 시간을 보고 놀랐습니다. 그리고 주문을 열기 전에 첫 번째 주문 아래 4줄에 Print(TimeCurrent())를 삽입합니다. 그리고 화면에서 즉시 Alert를 사용 하는 것이 좋습니다. 바로 보실 수 있습니다...

그리고 한 가지 더: if(New_Bar==false) if(New_Bar==true) 대신 if(!New_Bar) if(New_Bar)를 사용할 수 있습니다. 그렇지 않으면 버터를 얻습니다.

글쎄, 새로운 막대가 없다는 메시지와 함께 모든 것이 명확합니다. 플랫폼에서 잡지에 인쇄된 주문 시작 시간은 추가 인쇄 없이도 나에게 충분합니다. 코드에 따르면 포지션을 열기 위한 조건을 찾기 전에 새 바가 나타나야 하지만 새 바에서 한 번 주문이 열리고 다른 한 번 현재 주문이 열리는 이유는 여전히 불분명합니다.

 
novichok2018 :

글쎄, 새로운 막대가 없다는 메시지와 함께 모든 것이 명확합니다. 플랫폼에서 잡지에 인쇄된 주문 시작 시간은 추가 인쇄 없이도 나에게 충분합니다. 코드에 따르면 포지션을 열기 위한 조건을 찾기 전에 새 바가 나타나야 하지만 새 바에서 한 번 주문이 열리고 다른 한 번 현재 주문이 열리는 이유는 여전히 불분명합니다.

먼저 서버에 명령을 보냅니다. 틱이 와서 새로운 바가 생길 때까지? 새로운 바가 있습니까? 새 막대 가 없다는 메시지가 인쇄될 때마다 마지막으로 서버가 주문을 열었습니다. 시간을 보고 놀랐습니다. 그리고 주문을 열기 전에 첫 번째 주문 아래 4줄에 Print( TimeCurrent() )를 삽입합니다. 그리고 화면에서 즉시 Alert를 사용 하는 것이 좋습니다. 당신은 즉시 볼 수 있습니다 ... 주문을 여는 명령이 이전에 새 막대 에서 전송되었습니다.

 

말해봐, 2개의 표시선 사이에 색이 채워지도록 하려면 어떻게 해야 합니까?

이치모쿠처럼

 
Roman Sharanov :

말해봐, 2개의 표시선 사이에 색이 채워지도록 하려면 어떻게 해야 합니까? 이치모쿠처럼

어떻게 되었는지 보세요... 그리고 터미널은 아마도...

 

안녕하세요, 저는 2013년부터 비디오 자습서를 사용하여 MQL4를 배우기 시작했습니다. 비디오에서 코드를 정확히 다시 작성하고 필요한 다른 비디오에서 약간의 변경 사항을 추가하여 결과적으로 25개의 오류가 발생합니다. 이러한 오류에 대한 해결책을 찾으려고 노력했지만 내가 알기로는 터미널 빌드가 변경되었고 결과적으로 코드 작성에 약간의 변경이 있었습니다. 누군가 코드 편집에 도움을 주거나 최소한 좋은 조언을 해주시면 감사하겠습니다.

 //+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link        ""
#property version    "1.00"
#property strict

extern double Lots         = 0.1 ;
extern int     TakeProfit   = 50 ;
extern int     Step         = 50 ;
extern double Multiplier   = 2 ;
extern int     Slippage     = 5 ;
extern int     Magic        = 123 ;

extern int     MA_1_Period  = 21 ;
extern int     MA_1_Shift   = 0 ;

extern int     MA_2_Period  = 3 ;
extern int     MA_2_Shift   = 0 ;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if ( Digits == 3 || Digits == 5 )
   {
       TakeProfit *= 10 ;
       Step       *= 10 ;
       Slippage   *= 10 ;  
   }
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0 )
   {
       double ima_1 = iMA ( Symbol (), PERIOD_CURRENT , MA_1_Period, MA_1_Shift, MODE_SMA , PRICE_CLOSE , 1 );
       double ima_2 = iMA ( Symbol (), PERIOD_CURRENT , MA_2_Period, MA_2_Shift, MODE_SMA , PRICE_CLOSE , 1 );
      
       if (ima_1 > ima_2)
      {
         ticket = OrderSend ( Symbol (), OP_BUY , Lots, Ask , Slippage, 0 , 0 , "" , Magic, 0 , Blue);
         if (ticket > 0 )
         {
            TP = NormalizeDouble ( Ask + TakeProfit * Point , Digits );
             OrderModify (ticket, OrderOpenPrice (), 0 , TP, 0 );
         }
      }
       else if (ima_1 < ima_2)
      {
         ticket = OrderSend ( Symbol (), OP_SELL , Lots, Bid , Slippage, 0 , 0 , "" , Magic, 0 , Red);
         if (ticket > 0 )
         {
            TP = NormalizeDouble ( Bid - TakeProfit * Point , Digits );
             OrderModify (ticket, OrderOpenPrice (), 0 , TP, 0 );
         }
      }
      
   }
   else
   {
       int order_type = FindLastType();
       if (order_type == OP_BUY )
      {
         price = FindLastOrderPrice( OP_BUY );
         if ( Ask <= price - Step * Point )
         {
            Lastlot = FindLastLots ( OP_BUY );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket = OrderSend ( Symbol (), OP_BUY , lastlot, Ask , Slippage, 0 , 0 , "" , Magic, 0 , Blue);
             if (ticket > 0 )
               ModifiOrders( OP_BUY );
         }
      }
       else if (order_type == OP_SELL )
      {
          price = FindLastOrderPrice( OP_SELL );
         if ( Bid <= price + Step * Point )
         {
            Lastlot = FindLastLots ( OP_SELL );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket = OrderSend ( Symbol (), OP_BUY , lastlot, Bid , Slippage, 0 , 0 , "" , Magic, 0 , Red);
             if (ticket > 0 )
               ModifiOrders( OP_SELL );
         }        
      }
   }
   
   return ( 0 );
}
//+------------------------------------------------------------------+
void ModifiOrders( int otype)
{
   double avgprice = 0 ,
          order_lots= 0 ;
   
   price = 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (OrderSelecti(i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype)
         {
            price += OrderOpenPrice () * OrderLots ();
            order_lots += OrderLots ();
         }
      }
   }
   avgprice = NormalizeDouble (price / order_lots, Digits );
   
   if (otype == OP_BUY ) TP = NormalizeDouble (avgprice + TakeProfit* Point , Digits );
   if (otype == OP_SELL ) TP = NormalizeDouble (avgprice - TakeProfit* Point , Digits );
   
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype)
             OrderModify ( OrderTicket (), OrderOpenPrice (), 0 , TP, 0 )    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots( int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () ++ otype)
         {
            oldticket = OrderTicket ();
             if (oldticket > ticket)
            {
               oldlots = OrderLots ();
               ticket = oldticket;
            }
         }
      }
   }
   return (oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice( int otype)
{
   double oldopenprice;
   int     oldticket;
   
   ticket = 0 ;
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype
         {
            oldticket = OrderTicket ();
             if (oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice ();
               ticket = oldticket;
            }
         }
      }
   }
   return (oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               return ( OrderType ());
      }
   }
   return (- 1 );   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 i>= 0 ; i--)
   {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
             if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               count++;
        }
   }
   
   return (count);

//-------------------------------------------------------------------+

실수