Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 252

 
¿verdad?
Archivos adjuntos:
11.zip  7 kb
 
sergeev:
¿verdad?

Muestra error. Lohizo todo ¿funciona bien?

No se puede abrir "C:\NArchivos de programa\NdeAlpari Limited MT5 Demo 1\MQL5\Ninclude\NExpert\Signal\NMySignals\ACH_HM_RSI.incluir archivo expert_ah_hm_rsi.mq5 14 11

 
abeiks:

Muestra error. Lohizo todo ¿funciona bien?

No se puede abrir "C:\NArchivos de programa\NdeAlpari Limited MT5 Demo 1\MQL5\Ninclude\NExpert\Signal\NMySignals\ACH_HM_RSI.incluir archivo expert_ah_hm_rsi.mq5 14 11

Yo sí.

poner los archivos en las carpetas especificadas.

 
sergeev:

Lo soy.

poner los archivos en las carpetas especificadas.

Gracias, ¡funciona! :)

 

Hola a todos.

Estoy afinando el indicador CrossArbitr. Ayúdame a entender. Necesito que el valor de b(Total) sume s durante un minuto (0 barra) y se muestre con los otros indicadores en el gráfico, después de un minuto la suma s se fijó, s1=s, comienza a formarse de nuevo. El indicador s1 one también debe aparecer en el gráfico. Aquí está el código del indicador.

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

Además, estoy tratando de instalar un Asesor Experto Exp-Monitoring-Spread en un gráfico - no está instalado. MT4 escribe en el registro que no es un Asesor Experto y no puede ser instalado. No se han detectado errores en el compilador. Se ejecuta como una secuencia de comandos, pero el gráfico fuera de línea no funciona. ¿Qué se puede hacer? Se adjunta el código por si acaso.

#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;
}
 
¿Es posible arreglar un EA en el que haya que sustituir las operaciones normales de apertura por operaciones de arrastre?
 
ganri:
¿Es posible arreglar un EA en el que se quiera sustituir las operaciones abiertas normales por un trailing stop?
Si el Asesor Experto fue generado usando el Asistente MQL, entonces es fácil - cuando se crea un EA, es necesario especificar que se necesita un trailing stop y seleccionar en qué se basará el trailing stop.
 
barabashkakvn:
Si el Asesor Experto fue generado usando el Asistente MQL, es fácil - cuando se crea un EA, es necesario especificar que se necesita un trailing stop y seleccionar en qué se basará el trailing stop.
El Asesor Experto fue escrito para MT4
 
¡¿Es posible descargar los gráficos para el análisis técnico, - índices S & P 500 Futures Chart, TA 25 Chart, y S & P 500 Chart si es posible puede decir cómo hacerlo, tal vez hay una explicación de cómo descargar!
Se lo agradezco de antemano.