Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 252

 
oder?
Dateien:
11.zip  7 kb
 
sergeev:
oder?

Sie zeigt Fehler. Hat alles gut funktionieren?

kann "C:\Programmdateien\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI" nicht öffnen.Include-Datei expert_ah_hm_rsi.mq5 14 11

 
abeiks:

Sie zeigt Fehler. Hat alles gut funktionieren?

kann "C:\Programmdateien\Alpari Limited MT5 Demo 1\MQL5\include\Expert\Signal\MySignals\ACH_HM_RSI" nicht öffnen.Include-Datei expert_ah_hm_rsi.mq5 14 11

Das tue ich.

legt die Dateien in den angegebenen Ordnern ab.

 
sergeev:

Das bin ich.

legt die Dateien in den angegebenen Ordnern ab.

Danke, es klappt! :)

 

Hallo zusammen!

Ich arbeite an der Feinabstimmung des CrossArbitr-Indikators. Hilf mir zu verstehen. Ich brauche den Wert von b(Total) summiert s für eine Minute (0 bar) und mit den anderen Indikatoren auf dem Chart angezeigt, nach einer Minute die Summe s wurde festgelegt, s1=s, beginnen, wieder zu bilden. Der Indikator s1 one muss ebenfalls auf dem Chart angezeigt werden. Hier ist der Code des Indikators.

//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 

Außerdem versuche ich, einen Exp-Monitoring-Spread Expert Advisor auf einem Diagramm zu installieren - er ist nicht installiert. MT4 schreibt in das Protokoll, dass es sich nicht um einen Expert Advisor handelt und nicht installiert werden kann. Es wurden keine Fehler im Compiler festgestellt. Es wird als Skript ausgeführt, aber die Offline-Tabelle funktioniert nicht. Was kann getan werden? Der Code ist nur für den Fall beigefügt.

#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;
}
 
Ist es möglich, einen EA zu reparieren, bei dem man die normalen Eröffnungsgeschäfte durch Trailing Trades ersetzen muss?
 
ganri:
Ist es möglich, einen EA zu reparieren, bei dem man die normalen offenen Trades durch einen Trailing-Stop ersetzen möchte?
Wenn der Expert Advisor mit dem MQL-Assistenten erstellt wurde, ist es einfach - bei der Erstellung eines EA müssen Sie angeben, dass ein Trailing-Stop benötigt wird, und auswählen, worauf der Trailing-Stop basieren soll.
 
barabashkakvn:
Wenn der Expert Advisor mit dem MQL-Assistenten erstellt wurde, ist es einfach - bei der Erstellung eines EA müssen Sie angeben, dass ein Trailing-Stop benötigt wird, und auswählen, worauf der Trailing-Stop basieren soll.
Der Expert Advisor wurde für MT4 geschrieben
 
Ist es möglich, Charts für die technische Analyse herunterladen, - Indizes S & P 500 Futures Chart, TA 25 Chart, und S & P 500 Chart, wenn es möglich ist, kann Ihnen sagen, wie es zu tun, vielleicht gibt es eine Erklärung, wie zum Download!
Ich danke Ihnen im Voraus.