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

 

안녕하세요, pliz, 왜 작동하지 않는지 알려주세요. 오류는 없지만 테스터에서 주문이 열리지 않습니다. 훈련으로, 나는 일봉의 고저가 붕괴에 대한 조언자를 쓰려고 노력하고 있습니다.


 extern int       TimeCandle   = 1440 ;       //таймфрейм свечи, которую пробиваем 
extern int       HourStart= 10 ; // час начала торговли
extern double    Lots= 0.1 ;     // лот торговли   
extern int       StopLoss= 100 ; // стоплосс
extern int       TakeProfit= 100 ; // тайкпрофит
extern int       znak= 5 ;     // количество знаков котировки
extern int       magik= 54321 ;     // магик 

double minprice; // минимальная цена
double maxprice; // максимальная цена


void OnTick ()
  {
   double SL, TP;
   int ticket;
 
   minprice = iLow ( Symbol (),TimeCandle, 1 );
   maxprice = iHigh ( Symbol (),TimeCandle, 1 );   
   
   if (TimeHour( TimeCurrent ()==HourStart))
   { 
     if (BuyLimitCount()== 0 && BuyCount()== 0 ) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble (maxprice - StopLoss* Point ,znak);
    TP = NormalizeDouble (maxprice + TakeProfit* Point ,znak);
    ticket = OrderSend ( Symbol (), OP_BUYLIMIT,Lots,maxprice, 10 , SL,TP, "" , magik, 0 ,Blue);
    
     if (ticket < 0 )
     Print ( "Не удалось открыть ордер на покупку" );
    }
    
    
     if (SellLimitCount()== 0 && SellCount()== 0 ) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble (minprice + StopLoss* Point ,znak);
    TP = NormalizeDouble (minprice - TakeProfit* Point ,znak);
    ticket = OrderSend ( Symbol (), OP_SELLLIMIT,Lots,minprice, 10 , SL,TP, "" , magik, 0 ,Red);
        
     if (ticket < 0 )
     Print ( "Не удалось открыть ордер на продажу" );
    }
    
    }
     Comment ( "Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:" + DoubleToStr(maxprice, znak)); 
  }
   
   // проверяем есть ли байлимит ордера с конца
   int BuyLimitCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
     return (count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
   int SellLimitCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
     return (count);      
  }
  
   // проверяем есть ли бай ордера с конца
   int BuyCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
     return (count);      
  }
  
   // проверяем есть ли селл ордера с конца
   int SellCount()
  {
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
     return (count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby :

안녕하세요, pliz, 왜 작동하지 않는지 알려주세요. 오류는 없지만 테스터에서 주문이 열리지 않습니다. 훈련으로, 나는 일봉의 고저가 붕괴에 대한 조언자를 쓰려고 노력하고 있습니다.


열리지 않음 - 의미에서 시도하지 않거나 시도하지만 작동하지 않습니까? 그들은 잡지에 무엇을 적습니까?

 
nelenaby :

안녕하세요, pliz, 왜 작동하지 않는지 알려주세요. 오류는 없지만 테스터에서 주문이 열리지 않습니다. 훈련으로, 나는 일봉의 고저가 붕괴에 대한 조언자를 쓰려고 노력하고 있습니다.


이 표현을 분석

 if (TimeHour( TimeCurrent ()==HourStart))
        {
          ........
        }

이 표현의 의미를 이해하기가 어렵습니다. 제가 틀렸을 수도 있지만 적어도 "( TimeCurrent ()==HourStart) "를 "( TimeCurrent () - HourStart) "로 바꾸십시오.

 

또한 내가 올바르게 이해했다면 BuyLimitOrder 및 BuyPosition이 없으면 BuyLimit 주문을 시도하는 것입니다. "및"에주의하십시오. 즉, 그들 중 하나의 존재가 개별적으로 귀하에게 적합하므로 현재 가격 의 원하는 위치로 최소한 하나가 작동하고 첫 번째 위치가 될 때까지 각 틱마다 하나씩 무한한 ByLimits를 받게 됩니다. 열렸습니다. 또한 - 당신은 가격이 지금 어디에 있는지 상관하지 않습니다. 이상한 시간 조건이 충족되자마자(포스트 바로 위) 오류가 있는 것 같지만 오 글쎄요. 따라서 이를 고려하지 않으면 어제 고가를 주문 가격으로 사용하기 때문에 고문은 첫 번째 틱부터 가격이 어제 고가를 초과할 때까지 잘못된 주문을 하기 시작합니다. BuyLimit은 현재 가격보다 낮게 설정되어 있습니다. 즉, 현재 가격은 어제의 최고가보다 높아야 하며 그때까지는 실행이 거부됩니다.

따라서 가격이 어제의 고가를 넘어섰고 BuyLimits가 없으며 공개 구매가 없는 상황만이 귀하에게 적합합니다. 꽤 드문 조합. 또한 돌파가 되지 않고 돌파 후 롤백(ByLIMIT 때문에), 게다가 첫 번째 틱부터 시작하여 어제의 고가보다 오랜 시간 동안 오류가 발생합니다(또 다른 실수입니다). . 조건이 이미 충족되고 어드바이저가 주문을 보내지만 여전히 스프레드, 시장과의 최소 허용 거리 등이 있습니다.

 
Sergey Voytsekhovsky :

이 표현의 의미를 이해하기가 어렵습니다. 제가 틀렸을 수도 있지만 적어도 "( TimeCurrent ()==HourStart) "를 "( TimeCurrent () - HourStart) "로 바꾸십시오.

맞습니다, 여기에 오류가 있습니다. (TimeHour( TimeCurrent() )==HourStart)인 경우 필요

이제 때때로 거래를 열지만 더 많은 오류가 발생합니다(OrderSend 오류 130).

지정가 주문의 경우 이것은 올바르지 않습니다.

 
nelenaby :

맞습니다, 여기에 오류가 있습니다. 필요한 경우 (TimeHour(TimeCurrent())==HourStart)

이제 때때로 거래를 열지만 더 많은 오류가 발생합니다(OrderSend 오류 130).

지정가 주문의 경우 이것은 올바르지 않습니다.

다음은 시간 작업을 위한 스크립트입니다.

오래되었지만 올바르게 작동합니다.

파일:
 

안녕하세요.

파일 작업 방법을 알아내는 데 도움을 요청합니다.

프로그램이 실행되면 받은 데이터를 파일로 저장하고 CSV를 읽습니다.

파일이 커지고 있습니다. 속도가 떨어집니다. 행의 일부 요소를 업데이트(재작성)하려고 했습니다. 작동하지 않았다!

선택한 라인은 삭제할 수 없습니다! 이전 문자열에 새 요소를 추가할 수 없습니다!

아주 이상한! 파일, 그래픽 개체 등을 쉽게 삭제할 수 있습니다. 그리고 생성된 파일 작업에 관해서는 완전히 막다른 골목입니다!

포럼에는 "파일을 메모리로 읽고, 줄을 변경하거나 지우고, 새 파일을 이전 이름으로 저장하십시오."라는 단 하나의 권장 사항이 있습니다.

이것이 올바른 해결책이 아니라고 생각합니다. 아마도 내가 뭔가를 놓친 것 같습니다. 알아낼 수 있도록 도와주세요.

 
im-zvv :

나는 이것이 올바른 결정이 아니라고 생각합니다. 아마도 내가 뭔가를 놓친 것 같습니다. 알아낼 수 있도록 도와주세요.

파일 작업에 대한 이 "잘못된 결정"을 마침내 수정하려면 Microsoft에 긴급히 고용되어야 합니다.


파일 작업은 파일 편집기에서 파일을 편집하는 것과 같지 않으며 개별 문자가 있는 큐브에서 단어를 만드는 것과 비슷합니다.
새 문자를 삽입해야 하는 경우 그 뒤에 오는 모든 큐브를 오른쪽으로 이동해야 합니다.
오래된 문자를 제거하려면 그 뒤에 오는 모든 큐브를 왼쪽으로 이동해야 합니다.
따라서 파일이 크지 않고 파일에 대한 공유 액세스가 작업의 일부로 필요하지 않은 경우 실제로 새 파일에 데이터를 쓰고 이전 파일을 삭제하고 새 파일의 이름을 이름으로 변경하는 것이 더 쉽습니다. 오래된 것.

내가 틀리지 않았다면 파일 작업 시 MQL에서 누락된 유일한 것은 파일 길이를 필요한 크기로 자르는 기능입니다.


 
Alekseu Fedotov :

다음은 시간 작업을 위한 스크립트입니다.

오래되었지만 올바르게 작동합니다.

나는 또한 이전에 Kimovskaya 기능을 사용했는데 다음과 같이 나 자신에게 쓸 시간을 찾았습니다.

 //_______________________________________________________________________
class CWorkTime
  {
private :
   int                mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime           mstarttime,mstoptime;
   bool               UseThisSession;
   void inittime()
     {
      mday=Day();
       MqlDateTime dtstart,dtstop;
       TimeToStruct ( TimeCurrent (),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime (dtstart);
      mstoptime= StructToTime (dtstop);
     }
public :
   void               CWorkTime( void ){};
   void               ~CWorkTime( void ){};
   void               CWorkTime( int hstart, int mstart, int hstop, int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour< 0 || mstophour< 0 || mstarthour> 23 || mstophour> 23 ) ? false : true ;
      UseThisSession=(mstartmin< 0 || mstopmin< 0 || mstartmin> 59 || mstopmin> 59 ) ? false : true ;
       if (UseThisSession) inittime(); else Print ( "Время работы советника не используется" );
     };

   bool               Disable()
     {
       bool result= false ;
       if (UseThisSession)
        {
         if (mday!=Day()) inittime();
         datetime t= TimeCurrent ();
         result=t>=mstarttime && t<=mstoptime ? false : true ;
        }
       return (result);
     };
  }
*Work;


.....

int OnInit ()
{
   Work= new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick ()
  {

if (Work.Disable())
{
 Comment ( "Не торговое время!!! Сопровождение открытых ордеров" );
 }
else
{......
작업 시간 비활성화 - 생성자를 초기화할 때 잘못된 데이터를 입력해야 합니다(예: 25시간 또는 70분).
 
Sergey Dzyublik :

파일 작업에 대한 이 "잘못된 결정"을 마침내 수정하려면 Microsoft에 긴급히 고용되어야 합니다.


파일 작업은 파일 편집기에서 파일을 편집하는 것과 같지 않으며 개별 문자가 있는 큐브에서 단어를 만드는 것과 비슷합니다.
새 문자를 삽입해야 하는 경우 그 뒤에 오는 모든 큐브를 오른쪽으로 이동해야 합니다.
오래된 문자를 제거하려면 그 뒤에 오는 모든 큐브를 왼쪽으로 이동해야 합니다.
따라서 파일이 크지 않고 파일에 대한 공유 액세스가 작업의 일부로 필요하지 않은 경우 실제로 새 파일에 데이터를 쓰고 이전 파일을 삭제하고 새 파일의 이름을 이름으로 변경하는 것이 더 쉽습니다. 오래된 것.

내가 틀리지 않았다면 파일 작업 시 MQL에서 누락된 유일한 것은 파일 길이를 필요한 크기로 자르는 기능입니다.


고맙습니다. 좋은 설명. 불행히도 내 파일이 너무 커서 "큐브"로 작업해야 합니다.
사유: