Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 252

 
так?
Файлы:
11.zip  7 kb
 
sergeev:
так?

Показывает ошибку. У вас все нормально работало?

 

can't open "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI.mqh" include file          expert_ah_hm_rsi.mq5      14           11

 
abeiks:

Показывает ошибку. У вас все нормально работало?

 

can't open "C:\Program Files\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI.mqh" include file          expert_ah_hm_rsi.mq5      14           11

у меня да.

помещайте файлы в указанные папки.

 
sergeev:

у меня да.

помещайте файлы в указанные папки.

Спасибо, все работает! :)

 

Всем привет!

 Дорабатываю индикатор CrossArbitr. Помогите разобраться. Нужно чтобы значение b(Итог) суммировались s в течении минуты (0 бара) и отображались с другими показателями на графике, по истечению минуты сумма 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 на график - не ставится. МТ4 пишет в журнале, что он не является экспертом и не может быть установлен. Ошибок в компиляторе не выявлено. В качестве скрипта запускается, но не работает офлайн график. Что можно сделать? На всякий случай код прилагается. 

#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;
}
 
Можно ли поправить советник, в котором надо заменить обычные открываемые сделки на трейлинговые? 
 
ganri:
Можно ли поправить советник, в котором надо заменить обычные открываемые сделки на трейлинговые? 
Если советник был сгенерирован с помощью MQL Wizard'a, то это просто - в процессе создания советника нужно указать, что нужен трейлингстоп и выбрать на основе чего будет этот трейлинг.
 
barabashkakvn:
Если советник был сгенерирован с помощью MQL Wizard'a, то это просто - в процессе создания советника нужно указать, что нужен трейлингстоп и выбрать на основе чего будет этот трейлинг.
Советник был написан для МТ4
 
Можно ли загружать графики для тех.анализа,- индексов S&P 500 Futures Chart , TA 25 Chart, и S&P 500 Chart если это возможно может подскажете как это сделать,может есть объяснение как загружать!
Заранее благодарен.
Причина обращения: