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

 
사이트에 액세스할 수 없습니다
 

안녕하세요 개발자 여러분,

사용자 지정 날짜 또는 날짜 옵션이 있는 모든 전략 테스터 보기

그림을 보십시오:

전략 테스터

내가 원하는 것은 OnInit() 함수에서 내 프로그램의 시작 및 종료 날짜 값을 얻는 것입니다.

어떻게 받을 수 있나요?

 
Artyom Trishkin :

전체 루프를 함수로 만들고 발견하면 막대 번호를 반환하고 찾지 못하면 WRONG_VALUE를 반환합니다.


안녕하세요. 어제의 문제가있는 iCustom과 함께 작동하는 것 같습니다. 나는 모든 것을 기능으로 디자인했고 제어를 위해 " Comment "와 "Print"를 적용했습니다.

이 평가판 EA의 목적은 iCrossAD 표시기에서 위/아래 화살표 형태의 신호를 포착하고 이를 향후 프로그램에서 사용할 BUY 또는 SELL 명령으로 바꾸는 것입니다.

경험이 부족하니 엄하게 판단하지 마시기 바랍니다만, 어떻게 하는 것이 더 나았는지에 대한 합리적인 비판과 조언은 환영합니다.

이것이 바로 제가 이 포스트를 쓴 이유입니다. Advisor 및 Indicator 파일을 첨부합니다. 코드는 아래와 같습니다.

 //+------------------------------------------------------------------+
//|                                                  Test_iCusom.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
enum Indicator_Direction
   {
   Direction_BUY,
   Direction_SELL,
   Direction_FLAT
   };
//---
input string    Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD" ; //----- "Внешние параметры индикатора iCrossAD" -----
input uint      InpPeriodFind           = 400 ;                 // Bars for calculate
input uint      InpUnheckedBars         = 2 ;                   // Unchecked bars
input uint      InpPeriodIND            = 21 ;                   // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

int             CrossAD;                           //Хэндл индикатора iCrossAD

double          Buf_Arrow_Sell[],                   //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,             //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
datetime        Last_Arrow_Buy_time;               //Переменная для записи времени стрелки
               
double          Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
datetime        Last_Arrow_Sell_time;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ArraySetAsSeries (Buf_Arrow_Buy, true );
   ArraySetAsSeries (Buf_Arrow_Sell, true );
//---
   CrossAD = iCustom (asymbol.Name(), _Period , "iCrossAD" ,InpPeriodFind,InpUnheckedBars,InpPeriodIND);
   if (CrossAD == INVALID_HANDLE )
   {
       Print ( "Не удалось создать описатель индикатора iCrossAD!" );
       return ( INIT_FAILED );
   }
       else Print ( "Хендл iCrossAD = " ,CrossAD);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- delete objects
   ObjectsDeleteAll ( 0 , "" ,- 1 );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
  
   string direction = "no information" ;
   switch (iCustom_iCrossAD(InpPeriodFind))
      {
       case Direction_BUY: direction = "BUY" ;
         break ;
       case Direction_SELL: direction = "SELL" ;
         break ;
       case Direction_FLAT: direction = "FLAT" ;
         break ;
       case WRONG_VALUE : direction = "no information" ;
         break ;   
      }
   Comment ( "-------------------------" , 
             "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
             "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
             "\n Last_Arrow_Buy_time         = " ,Last_Arrow_Buy_time,
             "\n ---------------------- " ,
             "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
             "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index,
             "\n Last_Arrow_Sell_time         = " ,Last_Arrow_Sell_time,
             "\n ---------------------- " ,
             "\n Indicator_Direction             = " ,direction
            ); 
  }
//+------------------------------------------------------------------+
int iCustom_iCrossAD( uint PeriodFind) 
  { 
   Indicator_Direction direct = Direction_FLAT;
   
   if ( CopyBuffer (CrossAD, 1 , 0 , PeriodFind, Buf_Arrow_Buy) != PeriodFind)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ( WRONG_VALUE );
      }
         for ( int n= 0 ; n<( int )PeriodFind; n++)
            {
               if (n== 0 )
                   Print ( "Last_Arrow_Buy_index n==" ,n, " Last_Arrow_Buy_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Buy[n]== EMPTY_VALUE )
                   Print ( "Last_Arrow_Buy_index n==" ,n, " Last_Arrow_Buy_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , PeriodFind, Buf_Arrow_Sell) != PeriodFind)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ( WRONG_VALUE );
      }
         for ( int n= 0 ; n<( int )PeriodFind; n++)
            {
               if (n== 0 )
                   Print ( "Last_Arrow_Sell_index n==" ,n, " Last_Arrow_Sell_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Sell[n]== EMPTY_VALUE )
                   Print ( "Last_Arrow_Sell_index n==" ,n, " Last_Arrow_Sell_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index, ", Last_Arrow_Sell_time = " ,Last_Arrow_Sell_time);
                   break ;
               }
            }
   if (Last_Arrow_Buy_index < Last_Arrow_Sell_index)direct = Direction_BUY;
       else if (Last_Arrow_Buy_index > Last_Arrow_Sell_index)direct = Direction_SELL;
         else direct = Direction_FLAT;         
   return (direct); 
       //return(WRONG_VALUE); 
  }
//+------------------------------------------------------------------+
파일:
iCrossAD.mq5  49 kb
 
좋은 오후입니다. EA에는 다른 주문이 실행될 때 보류 중인 주문을 삭제 하는 기능이 있습니다. 이 기능을 비활성화할 수 있는 외부 매개변수를 등록하는 방법. 미리 감사드립니다.
파일:
ths42o20.txt  1 kb
 

안녕하세요!

표시기를 MT4에서 MT5로 다시 코딩했습니다. 표시기를 애드온으로 사용하고 싶습니다. 필터.

MT5를 배우고 있습니다. 그러나 오류를 찾을 수 없습니다. MT4와 MT5의 디스플레이는 다릅니다.

전문가에게 요청 - *.mql5 파일에서 오류를 찾는 데 도움을 주세요.

소스 코드가 첨부되어 있습니다.

도움을 주셔서 미리 감사드립니다.

파일:
ReVoIn.mq4  4 kb
ReVoIn.mq5  11 kb
 
Priffekt :
좋은 오후입니다. EA에는 다른 주문이 실행될 때 보류 중인 주문을 삭제 하는 기능이 있습니다. 이 기능을 비활성화할 수 있는 외부 매개변수를 등록하는 방법. 미리 감사드립니다.
DeleteOppositeOrders();
void DeleteOppositeOrders() {
   bool fd, fep1, fep2;

  fep1=ExistPosition( 1 );
  fep2=ExistPosition( 2 );

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()== Symbol ()) {
        fd=False;
         if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
           if (fep2) fd=OrderDelete(OrderTicket());
        }
         if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
           if (fep1) fd=OrderDelete(OrderTicket());
        }
         if (fd && UseSound) PlaySound (NameFileSound);
      }
    }
  }
}
bool ExistPosition( int mn) {
   bool Exist=False;
   for ( int i= 0 ; i< OrdersTotal (); i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()== Symbol () && OrderMagicNumber()== Magik) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break ;
        }
      }
    }
  }
   return (Exist);
}

이것은 귀하의 코드이므로 첨부하는 것이 좋습니다.

 

물론 제가 어드바이저라는 역할에는 별로 어울리지 않는데 그 일을 하는 것이 어렵지는 않은 것 같습니다.

나는 당신의 코드 자체에 맞지 않는다는 점에 유의하십시오. 당신의 함수가 void 유형이라는 사실부터 시작하여 저(찻주전자)에게도 매우 논란의 여지가 많습니다. 이 유형은 함수가 값을 반환하지 않음 을 나타내거나 함수 매개변수로 매개변수가 없음을 나타내는 데 사용됩니다. 그리고 코드 끝에서 - return(Exist);

들어오는 변수를 선언하고 함수에 매개변수로 쓰고 'incoming' 변수가 False로 설정되어 있으면 함수를 종료합니다.

 
input bool On_Off = true;
DeleteOppositeOrders(On_Off);
void DeleteOppositeOrders(bool on_off) {

  if(on_off==false)return;

  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}
 
Priffekt :
좋은 오후입니다. EA에는 다른 주문이 실행될 때 보류 중인 주문을 삭제 하는 기능이 있습니다. 이 기능을 비활성화할 수 있는 외부 매개변수를 등록하는 방법. 미리 감사드립니다.

코드 텍스트에서 모두 False와 True를 찾습니다. false와 true로 바꾸십시오. 이 언어는 대소문자를 구분합니다.

 
Sergey Voytsekhovsky :

코드 텍스트에서 모두 False와 True를 찾습니다. false 및 true로 바꿉니다. 이 언어는 대소문자를 구분합니다.

안녕하세요, 모든 값을 변경했지만 전문가 설정 에서 기능 자체를 비활성화하는 가능성에 관심이 있습니다.
 삭제 반대 주문();
무효 DeleteOppositeOrders() {
  부울 fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=거짓;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== 매직) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== 매직) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
부울 ExistPosition(int mn) {
  부울 존재=거짓;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== 매직) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          존재 = 사실; 부서지다;
        }
      }
    }
  }
  반환(존재);
}