초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 252

 
그래서?
파일:
11.zip  7 kb
 
sergeev :
그래서?

오류. 당신은 모든 것을 가지고 그것은 잘 작동 했습니까?

 

"C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI.mqh" 포함 파일을 열 수 없습니다.           Expert_ah_hm_rsi.mq5       십사            열하나

 
abeiks :

오류. 당신은 모든 것을 가지고 그것은 잘 작동 했습니까?

 

"C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI.mqh" 포함 파일을 열 수 없습니다.           Expert_ah_hm_rsi.mq5       십사            열하나

나는 예가 있습니다.

지정된 폴더에 파일을 넣습니다.

 
sergeev :

나는 예가 있습니다.

지정된 폴더에 파일을 넣습니다.

감사합니다. 작동합니다! :)

 

안녕하세요!

CrossArbitr 표시기를 마무리 중입니다. 이해하도록 도와주세요. b(Total) 값은 1분(0 bar) 내에 s로 합산되고 차트의 다른 지표와 함께 표시되어야 합니다. 1분 후에 합계 s가 고정되고 s1=s가 다시 형성되기 시작합니다. 지표 s1만 해도 차트에 표시되어야 합니다. 다음은 표시기 코드입니다.

 //+------------------------------------------------------------------+
//|                                                  CrossArbitr.mq4 |
//|                                                        Scriptong |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link        ""

#property indicator_chart_window
//---- input parameters
extern bool       ShowBid= false ;
extern bool       ShowAsk= false ;
extern color      BidColor = Lime;
extern color      AskColor = Yellow;
extern int        AlarmIfPointDifference = 10 ;
extern string     AlarmFile = "wait.wav" ; 


bool Activate = False;
string FP, SP;
double Tick;
int WayForCross;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string S = Symbol ();
   if ( StringFind (S, "USD" , 0 ) != - 1 )
     {
       Comment ( "Индикатор работает только с кроссовыми парами (GBPJPY, EURJPY, EURGBP и т. д)!" );
       return ( 0 );
     }

   if ( StringLen (S) != 6 )
     {
       Comment ( "Индикатор работает только с валютными парами, у которых название состоит из шести символов!" );
       return ( 0 );
     }
     
   // Поиск первой валютной пары кросса
   FP = StringSubstr (S, 0 , 3 )+ "USD" ;
   MarketInfo(FP, MODE_BID);
   if ( GetLastError () > 0 )
     {
      FP = "USD" + StringSubstr (S, 0 , 3 );
      MarketInfo(FP, MODE_BID);
       if ( GetLastError () > 0 )
        {
         Comment ( "Невозможно найти инструмент " , FP, " или " , StringSubstr (S, 0 , 3 )+ "USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор." );
         return ( 0 );
        } 
     } 
   // --------------------------------------  
     
   // "Создание" второй валютной пары кросса
   SP = "USD" + StringSubstr (S, 3 , 3 );
   MarketInfo(SP, MODE_BID);
   if ( GetLastError () > 0 )
     {
      SP = StringSubstr (S, 3 , 3 )+ "USD" ;
      MarketInfo(SP, MODE_BID);
       if ( GetLastError () > 0 )
        {
         Comment ( "Невозможно найти инструмент " , SP, " или " , StringSubstr (S, 3 , 3 )+ "USD. Необходимо добавить его в Обзоре рынка и перезапустить индикатор." );
         return ( 0 );
        } 
     } 
   // --------------------------------------  

   // Определение пути синтеза кросса
   if ( StringFind (FP, "USD" ) == 3 && StringFind (SP, "USD" ) == 0 )
     WayForCross = 1 ;
   if ( StringFind (FP, "USD" ) == 0 && StringFind (SP, "USD" ) == 0 )
     WayForCross = 2 ;
   if ( StringFind (FP, "USD" ) == 3 && StringFind (SP, "USD" ) == 3 )
     WayForCross = 3 ;
   if ( StringFind (FP, "USD" ) == 0 && StringFind (SP, "USD" ) == 3 )
     WayForCross = 4 ;
   // -------------------------------

   Tick = MarketInfo( Symbol (), MODE_TICKSIZE);
   
   Activate = True;  
//----
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment ( "" );
   if ( ObjectFind ( "CrossBid" ) == 0 )
     ObjectDelete ( "CrossBid" );
   if ( ObjectFind ( "CrossAsk" ) == 0 )
     ObjectDelete ( "CrossAsk" );
   
//----
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| Приведение значений к точности одного тика                       |
//+------------------------------------------------------------------+
double ND( double A)
{
 return ( NormalizeDouble (A, Digits ));
}  

//+------------------------------------------------------------------+
//| Расчет значения синтетического бида                              |
//+------------------------------------------------------------------+
double CalcBidWayForCross()
{
 switch (WayForCross)
   {
     case 1 : return (ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_BID)));
     case 2 : return (ND(MarketInfo(SP, MODE_BID)/MarketInfo(FP, MODE_ASK)));
     case 3 : return (ND(MarketInfo(FP, MODE_BID)/MarketInfo(SP, MODE_ASK)));
     case 4 : return ( 1 /(ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_BID))));
   }
}

//+------------------------------------------------------------------+
//| Расчет значения синтетического аска                              |
//+------------------------------------------------------------------+
double CalcAskWayForCross()
{
 switch (WayForCross)
   {
     case 1 : return (ND(MarketInfo(FP, MODE_ASK)*MarketInfo(SP, MODE_ASK)));
     case 2 : return (ND(MarketInfo(SP, MODE_ASK)/MarketInfo(FP, MODE_BID)));
     case 3 : return (ND(MarketInfo(FP, MODE_ASK)/MarketInfo(SP, MODE_BID)));
     case 4 : return ( 1 /(ND(MarketInfo(FP, MODE_BID)*MarketInfo(SP, MODE_ASK))));
   }
}

  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int     counted_bars=IndicatorCounted();
//----
   if (!Activate)
     return ( 0 );

   // Расчет синтетических Bid и Ask
   double CalcBid = CalcBidWayForCross();  
   RefreshRates();
   double CalcAsk = CalcAskWayForCross();  
   double n,m,b,s,s1;
   int t = Seconds();
   
   // -------------------------------

   // Рисуем уровень синтетического Bid
   if (ShowBid)
     {
       if ( ObjectFind ( "CrossBid" ) == - 1 )
        {
         ObjectCreate ( "CrossBid" , OBJ_HLINE , 0 , 0 , CalcBid); 
         ObjectSet( "CrossBid" , OBJPROP_COLOR , BidColor);
         ObjectSet( "CrossBid" , OBJPROP_STYLE , STYLE_DOT );
        } 
       else
         if (! ObjectMove ( "CrossBid" , 0 , 1 , CalcBid))
           Print ( "Ошибка перемещения №" , GetLastError ());
     }
   // ----------------------------------        

   // Рисуем уровень синтетического Ask
   if (ShowAsk)
    {
     if ( ObjectFind ( "CrossAsk" ) == - 1 )
       {
         ObjectCreate ( "CrossAsk" , OBJ_HLINE , 0 , 0 , CalcAsk); 
        ObjectSet( "CrossAsk" , OBJPROP_COLOR , AskColor);
        ObjectSet( "CrossAsk" , OBJPROP_STYLE , STYLE_DOT );
       } 
       else
       ObjectMove ( "CrossAsk" , 0 , 1 , CalcAsk);
      
       if (t > 0 )
       {s=b; b++;}
       else s1=s;
    }
   // ----------------------------------        
 
   Comment ( "Реальный BID = " , DoubleToStr(Bid, Digits ), ", реальный ASK = " , DoubleToStr(Ask, Digits ), 
           "\nСинтетик BID = " , DoubleToStr(CalcBid, Digits ), ", синтетик ASK = " , DoubleToStr(CalcAsk, Digits ),
           "\nРазница BID Синтетика и Реального =" , n=(Bid-CalcBid),
           "\, Разница ASK Синтетика и Реального =" , m=(CalcAsk-Ask),
           "\nИтог =" , b=(CalcAsk-Ask) - (Bid-CalcBid),
           "\nПрошлый бар =" , s1, ", Текущий бар =" , s
           );
  
  
   // Выдаем звуковой сигнал о превышении минимальной разности
   if (ND( MathAbs (CalcBid-Bid)) >= ND(AlarmIfPointDifference* Point ))
     PlaySound (AlarmFile);
   // --------------------------------------------------------  
    
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 

그런데도 Exp-Monitoring-Spread 전문가를 차트에 설치하려고 합니다. 설정되지 않았습니다. MT4는 전문가가 아니라 설치할 수 없다고 로그에 기록합니다. 컴파일러에서 오류가 발견되지 않았습니다. 스크립트로 실행되지만 오프라인 차트는 작동하지 않습니다. 무엇을 할 수 있습니까? 만일의 경우를 대비하여 코드를 첨부합니다.

 #property show_inputs

#import "user32.dll"
   int PostMessageA( int hWnd, int Msg, int wParam, int lParam);
#import

#define WM_COMMAND 0x0111

#define PAUSE 100

extern string Currency = "USD" ;

string Symbol1, Symbol2;
bool Math; // 0 - S1 / S2, 1 - S1 * S2, 2 - 1 / (S1 * S2)

int handle;
string SymbolName ;

int time;
double open, low, high, close;
int volume;
double PriceBid, PriceAsk;
double Bid1 = 0 , Bid2 = 0 , Ask1 = 0 , Ask2 = 0 ;
int Digits1, Digits2;  

double MinSpread, MaxSpread, AverageSpread;

bool RealSymbol( string Str )
{
   return (MarketInfo(Str, MODE_BID) != 0 );
}

void GetSymbols()
{
   string Currency1, Currency2;
   string SymbolPrefix;
   string Str1, Str2;
  
  Currency1 = StringSubstr ( Symbol (), 0 , 3 );
  Currency2 = StringSubstr ( Symbol (), 3 , 3 );
  SymbolPrefix = StringSubstr ( Symbol (), 6 , StringLen ( Symbol ()) - 6 );
  
  Str1 = Currency1 + Currency + SymbolPrefix;
  Str2 = Currency + Currency1 + SymbolPrefix;
  
   if (RealSymbol(Str1))
  {
    Symbol1 = Str1; 
    
    Str1 = Currency2 + Currency + SymbolPrefix;
    Str2 = Currency + Currency2 + SymbolPrefix;
    
     if (RealSymbol(Str1))
    {
      Symbol2 = Str1; 
      Math = 0 ; //  S1 / S2
    }
     else if (RealSymbol(Str2))
    {
      Symbol2 = Str2; 
      Math = 1 ; // S1 * S2
    }
  }
   else if (RealSymbol(Str2))
  {
    Symbol2 = Str2; 
    
    Str1 = Currency2 + Currency + SymbolPrefix;
    Str2 = Currency + Currency2 + SymbolPrefix;
    
     if (RealSymbol(Str1))
    {
      Symbol1 = Str1; 
      Math = 2 ; // 1 / (S1 * S2)
    }
     else if (RealSymbol(Str2))
    {
      Symbol1 = Str2; 
      Math = 0 ; // S1 / S2
    }
  }
  
   return ;
}

bool GetPrices()
{  
   switch (Math)
  {
   case 0 : // S1 / S2
    PriceBid = Bid1 / Ask2;
    PriceAsk = Ask1 / Bid2;
     break ;
   case 1 : // S1 * S2
    PriceBid = Bid1 * Bid2;
    PriceAsk = Ask1 * Ask2;
     break ;
   case 2 : // 1 / (S1 * S2)
    PriceBid = 1 / (Ask1 * Ask2);
    PriceAsk = 1 / (Bid1 * Bid2);
     break ;
  }
  
   return ;
}

bool SymbolChange()
{
   double NewBid1, NewBid2, NewAsk1, NewAsk2;

  NewBid1 = MarketInfo(Symbol1, MODE_BID);
  NewBid2 = MarketInfo(Symbol2, MODE_BID);
  NewAsk1 = MarketInfo(Symbol1, MODE_ASK);
  NewAsk2 = MarketInfo(Symbol2, MODE_ASK);
  
   if (( NormalizeDouble (NewBid1 - Bid1, Digits1) != 0 ) || ( NormalizeDouble (NewBid2 - Bid2, Digits2) != 0 ) ||
      ( NormalizeDouble (NewAsk1 - Ask1, Digits1) != 0 ) || ( NormalizeDouble (NewAsk2 - Ask2, Digits2) != 0 ))
  {
    Bid1 = NewBid1;
    Bid2 = NewBid2;
    Ask1 = NewAsk1;
    Ask2 = NewAsk2;
    
    GetPrices();
    
     return (TRUE);
  }
  
   return (FALSE);
}

void WriteBar()
{
   FileWriteInteger (handle, time);
   FileWriteDouble (handle, open);
   FileWriteDouble (handle, low);
   FileWriteDouble (handle, high);
   FileWriteDouble (handle, close);
   FileWriteDouble (handle, volume);
  
   FileFlush (handle);
  
   return ;
}

int GetLastTime()
{
   int Tmp1, Tmp2;
  
  Tmp1 = iTime(Symbol1, Period (), 0 );
  Tmp2 = iTime(Symbol2, Period (), 0 );
  
   if (Tmp1 > Tmp2)
     return (Tmp1);
    
   return (Tmp2);
}

void CreateNewBar()
{
  time = GetLastTime();
  
  open = PriceBid;
  low = PriceBid;
  high = PriceBid;
  close = PriceBid;
  
  volume = 1 ;
 
   return ;
}

void ModifyBar()
{
   if (PriceBid > high)
    high = PriceBid;
   else if (PriceBid < low)
    low = PriceBid;
    
  close = PriceBid;

  volume++;
}

void CreateNewSpread()
{
  MinSpread = (PriceAsk - PriceBid) / Point ;
  MaxSpread = MinSpread;
  AverageSpread = MinSpread;
  
   return ;
}

void ModifySpread()
{
   double Spread = (PriceAsk - PriceBid) / Point ;
  
   if (Spread > MaxSpread)
    MaxSpread = Spread;
   else if (Spread < MinSpread)
    MinSpread = Spread;
    
  AverageSpread += Spread;
  
   return ;
}

void WriteSpread()
{
   int hSpread = FileOpen ( SymbolName + Period () + "_Spread.dat" , FILE_BIN | FILE_READ | FILE_WRITE );
  
  AverageSpread /= volume;
  
   FileSeek (hSpread, 0 , SEEK_END );
   FileWriteInteger (hSpread, time);
   FileWriteDouble (hSpread, MaxSpread);
   FileWriteDouble (hSpread, AverageSpread);
   FileWriteDouble (hSpread, MinSpread);
  
   FileClose (hSpread);

   return ;  
}

void CreateHandle()
{
   string FileName;
   int Tmp[ 15 ], TmpTime;

   SymbolName = StringSubstr ( Symbol (), 0 , 6 ) + "_" + Currency;
  FileName = SymbolName + Period () + ".hst" ;
  handle = FileOpenHistory(FileName, FILE_BIN | FILE_READ | FILE_WRITE );
    
   if ( FileSize (handle) > 0 )
  {
     if ( FileSize (handle) > 148 )
    {
       FileSeek (handle, - 44 , SEEK_END );
      TmpTime = FileReadInteger (handle);
      
       if (TmpTime == time)
      {
        open = FileReadDouble (handle);
        low = FileReadDouble (handle);
        high = FileReadDouble (handle);
        close = FileReadDouble (handle);
        volume = FileReadDouble (handle);
      
         return ;
      }
    }

     FileSeek (handle, 0 , SEEK_END );
        
     return ;
  }

   FileClose (handle);
  
  handle = FileOpenHistory(FileName, FILE_BIN | FILE_WRITE );
  
   FileWriteInteger (handle, 400 );
   FileWriteString (handle, "Created by " + WindowExpertName(), 64 );
   FileWriteString (handle, SymbolName , 12 );
   FileWriteInteger (handle, Period ());
   FileWriteInteger (handle, Digits );
   FileWriteArray (handle, Tmp, 0 , 15 );

   return ;
}

void RefreshChart()
{
   int hwnd = WindowHandle( SymbolName , Period ());

  PostMessageA(hwnd, WM_COMMAND, 33324 , 0 );
    
   return ;
}

string GetComment()
{
   int Spread = (Ask - Bid) / Point + 0.1 ;
   double SpreadX = (PriceAsk - PriceBid) / Point ;
   string Str;
  
  Str = Symbol () + " spread = " + Spread + "\n" + SymbolName + " spread = " + DoubleToStr(SpreadX, 1 );
  Str = Str + "\nDifference = " + DoubleToStr(Spread - SpreadX, 1 );
  
   return (Str);
}

void init()
{  
  GetSymbols();
  
  Digits1 = MarketInfo(Symbol1, MODE_DIGITS);
  Digits2 = MarketInfo(Symbol2, MODE_DIGITS);

  SymbolChange();
  CreateNewBar();
  CreateNewSpread();

  CreateHandle();
  
   return ;
}

void deinit()
{
   FileClose (handle);
  
   Comment ( "" );
  
   return ;
}

void start()
{
   while (! IsStopped ())
  {
     if (SymbolChange())
    {
       Comment (GetComment());
      
       if (time < GetLastTime())
      {
        WriteBar();
        WriteSpread();
        
        CreateNewBar();
        CreateNewSpread();

        RefreshChart();        
      }
       else
      {
        ModifyBar();
        ModifySpread();
      }
    }
    
     Sleep (PAUSE);
    RefreshRates();
  }
  
   return ;
}
 
평소에 열린 거래를 후행 거래로 대체해야하는 Expert Advisor를 수정할 수 있습니까?
 
ganri :
평소에 열린 거래를 후행 거래로 대체해야하는 Expert Advisor를 수정할 수 있습니까?
EA가 MQL 마법사를 사용하여 생성된 경우 EA를 생성하는 과정 에서 후행 중지가 필요함을 표시하고 이 후행이 기반으로 할 대상을 선택해야 합니다.
 
barabashkakvn :
EA가 MQL 마법사를 사용하여 생성된 경우 EA를 생성하는 과정 에서 후행 중지가 필요함을 표시하고 이 후행이 기반으로 할 대상을 선택해야 합니다.
EA는 MT4용으로 작성되었습니다.
 
기술 분석을 위한 차트를 다운로드할 수 있습니까 - S&P 500 선물 차트, TA 25 차트 및 S&P 500 차트 지수, 가능하다면 어떻게 하는지 알려주실 수 있나요? 다운로드 방법에 대한 설명이 있을 수 있습니다!
미리 감사드립니다.
사유: