Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 898

 
ponochka :
¡Hola! Ayúdame a hacer lo siguiente:
¡Es necesario obtener una ganancia objetivo para cada posición abierta en el mercado, pero no general, sino separada!
ejemplo: EURUSD abrió y tiene una ganancia objetivo de $ 1 en su configuración, y tan pronto como la alcanzó, la posición se cerró sola, ¡solo ella!
por lo tanto, cada par de divisas debería funcionar por sí solo, ¡y no de acuerdo con la ganancia total!

Encontré el código para el beneficio total de todos los pares:
ayúdenme a rehacerlo para cada par de divisas por separado...... ¡Gracias de antemano!

Si cavas, puedes encontrarlo.

 //+----------------------------------------------------------------------------+
//|                                          e-CloseByProfitPosInCurrency.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  22.04.2008  Советник закрывает только те позиции, у которых профит        |
//|              в валюте депозита превысил некоторое заданное значение.       |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link        "http://www.kimiv.ru"


//------- Внешние параметры советника -----------------------------------------+
string _P_Expert = "---------- Параметры советника" ;
extern int     NumberAccount = 0 ;       // Номер торгового счёта
extern string symbol        = "" ;       // Торговый инструмент
                                       //   ""  - любой
                                       //   "0" - текущий
extern int     Operation     = - 1 ;       // Торговая операция:
                                       //   -1 - любая
                                       //    0 - OP_BUY
                                       //    1 - OP_SELL
extern double Profit        = 50 ;       // Профит в валюте депозита
extern int     MagicNumber   = 0 ;       // MagicNumber
extern bool    ShowComment   = True;     // Показывать комментарий


//------- Глобальные переменные советника -------------------------------------+
bool    gbNoInit      = False;           // Флаг неудачной инициализации
int     Slippage      = 3 ;               // Проскальзывание цены
int     NumberOfTry   = 5 ;               // Количество торговых попыток
bool    UseSound      = True;           // Использовать звуковой сигнал
string NameFileSound = "expert.wav" ;   // Наименование звукового файла
color   clCloseBuy    = Blue;           // Цвет значка закрытия покупки
color   clCloseSell   = Red;             // Цвет значка закрытия продажи

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>             // Стандартная библиотека


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() {
  gbNoInit = False;
   if (!IsTradeAllowed()) {
    Message( "Для нормальной работы советника необходимо\n" +
             "Разрешить советнику торговать" );
    gbNoInit=True; return ;
  }
   if (!IsLibrariesAllowed()) {
    Message( "Для нормальной работы советника необходимо\n" +
             "Разрешить импорт из внешних экспертов" );
    gbNoInit=True; return ;
  }
   if (Operation<- 1 || Operation> 1 ) {
    Message( "Недопустимое значение внешнего параметра Operation" );
    gbNoInit=True; return ;
  }
   if (symbol!= "0" && symbol!= "" ) {
     if (MarketInfo(StringUpper(symbol), MODE_BID)== 0 ) {
      Message( "В обзоре рынка отсутствует символ " +symbol);
      gbNoInit=True; return ;
    }
  }
   if (!IsTesting()) {
     if (IsExpertEnabled()) Message( "Советник будет запущен следующим тиком" );
     else Message( "Отжата кнопка \"Разрешить запуск советников\"" );
  }
}

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment ( "" ); }

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
   if (gbNoInit) {
     Comment ( "Не удалось инициализировать советник!" ); return ;
  }
   if (!IsTesting()) {
     if (NumberAccount> 0 && NumberAccount!=AccountNumber()) {
       Comment ( "Работа на счёте: " +AccountNumber()+ " ЗАПРЕЩЕНА!" );
       return ;
    } else Comment ( "" );
     if (ShowComment) {
       string st= "NumberAccount=" +DoubleToStr(NumberAccount, 0 )
               + "  Symbol=" +IIFs(symbol== "0" , "All" , IIFs(symbol== "" , Symbol (), StringUpper(symbol)))
               + "  Operation=" +IIFs(Operation< 0 , "All" , GetNameOP(Operation))
               + "  Profit=" +DoubleToStr(Profit, 2 )+ " " +AccountCurrency()
               + "  MagicNumber=" +DoubleToStr(MagicNumber, 0 )
               +IIFs(ShowComment, "  ShowComment" , "" )
               ;
       Comment (st);
    } else Comment ( "" );
  }

  ClosePosBySizeProfitInCurrency(StringUpper(symbol), Operation, MagicNumber, Profit);
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
   bool    fc;
   color   clClose;
   double ll, pa, pb, pp;
   int     err, it;

   if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
     for (it= 1 ; it<=NumberOfTry; it++) {
       if (!IsTesting() && (!IsExpertEnabled() || IsStopped ())) break ;
       while (!IsTradeAllowed()) Sleep ( 5000 );
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
       if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
       if (fc) {
         if (UseSound) PlaySound (NameFileSound); break ;
      } else {
        err= GetLastError ();
         if (err== 146 ) while (IsTradeContextBusy()) Sleep ( 1000 * 11 );
         Print ( "Error(" ,err, ") Close " ,GetNameOP(OrderType()), " " ,
              ErrorDescription(err), ", try " ,it);
         Print (OrderTicket(), "  Ask=" ,pa, "  Bid=" ,pb, "  pp=" ,pp);
         Print ( "sy=" ,OrderSymbol(), "  ll=" ,ll, "  sl=" ,OrderStopLoss(),
               "  tp=" ,OrderTakeProfit(), "  mn=" ,OrderMagicNumber());
         Sleep ( 1000 * 5 );
      }
    }
  } else Print ( "Некорректная торговая операция. Close " ,GetNameOP(OrderType()));
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых профит в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит                                                             |
//+----------------------------------------------------------------------------+
void ClosePosBySizeProfitInCurrency( string sy= "" , int op=- 1 , int mn=- 1 , double pr= 0 ) {
   int i, k= OrdersTotal ();

   if (sy== "0" ) sy= Symbol ();
   for (i=k- 1 ; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (mn< 0 || OrderMagicNumber()==mn) {
             if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP( int op) {
   switch (op) {
     case OP_BUY      : return ( "Buy" );
     case OP_SELL     : return ( "Sell" );
     case OP_BUYLIMIT : return ( "Buy Limit" );
     case OP_SELLLIMIT: return ( "Sell Limit" );
     case OP_BUYSTOP  : return ( "Buy Stop" );
     case OP_SELLSTOP : return ( "Sell Stop" );
     default           : return ( "Unknown Operation" );
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs( bool condition, string ifTrue, string ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message( string m) {
   Comment (m);
   if ( StringLen (m)> 0 ) Print (m);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper( string s) {
   int c, i, k= StringLen (s), n;
   for (i= 0 ; i<k; i++) {
    n= 0 ;
    c=StringGetChar(s, i);
     if (c> 96 && c< 123 ) n=c- 32 ;     // a-z -> A-Z
     if (c> 223 && c< 256 ) n=c- 32 ;   // а-я -> А-Я
     if (c== 184 ) n= 168 ;             //  ё  ->  Ё
     if (n> 0 ) s=StringSetChar(s, i, n);
  }
   return (s);
}
//+----------------------------------------------------------------------------+

 
Hola. ¿Puede alguien explicar a una persona sin experiencia por qué la función

dobleiOpen(
símbolo de cadena,// símbolo
inttimeframe,// período
intdesplazamiento // desplazamiento
);

si inserto el nombre del símbolo de un instrumento, como dice el manual,(no 0 y no NULL) y lo ejecuto en el probador en el gráfico, obtengo la respuesta 0.0? Al mismo tiempo 0 y NULL dan valores correctos. Gracias.

 
novichok2018:
Hola. ¿Puede alguien explicar a una persona sin experiencia por qué la función

dobleiOpen(
cadenasímbolo,// símbolo
inttimeframe,// periodo
intshift// desplazamiento
);

Si inserto un nombre de herramienta simbólico como dice el manual,(no 0 y no NULL) y lo ejecuto en el probador en el gráfico, ¿obtengo una respuesta de 0,0? Al mismo tiempo 0 y NULL dan los valores correctos. Gracias.

Oops, perdón, descuidado: sólo me faltó una letra en el nombre del instrumento. No pasa nada: un lingüista es un lingüista.

 
novichok2018:

Oops, lo siento, no estaba prestando atención: sólo me faltó una letra en el nombre del instrumento. No pasa nada: un lingüista es un lingüista.

Y ahora tengo otra pregunta: ¿por qué el doble DJop1 = iOpen("DowJones30",PERIOD_H1,1) lanzado en otro instrumento (no DowJones30) produce valores correctos, mientras que el doble DJbid = MarketInfo("DowJones30",MODE_BID) produce 0,0, aunque funciona bien en DowJones30?

 
Alekseu Fedotov:

Gracias, no está claro, la posición es ahora más, pero dice 0,25.

void OnTick()
  {
//---
   double drawdown=AccountProfit()*100/AccountBalance();
   Comment("текущая просадка  = ",drawdown);
  }
Archivos adjuntos:
htygj.jpg  421 kb
 
nalyk:

Gracias, no está claro, ahora la posición está en el lado positivo, pero dice 0,25.

Así es, haz las cuentas.

 

¿Quién puede ayudar con esta pregunta https://www.mql5.com/ru/forum/160683/page897#comment_12221175?

 
Seric29:

¿Quién puede ayudar con esta pregunta https://www.mql5.com/ru/forum/160683/page897#comment_12221175?

#property strict

template<typename T>struct A
  {
   T                 val;
   int               ind;
  };
  A<double> MyStructDouble;
  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MyStructDouble.val = 123.456;
   MyStructDouble.ind = 123;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  Print("MyStructDouble.val = ",MyStructDouble.val," , MyStructDouble.ind = ",MyStructDouble.ind);
  }
//+------------------------------------------------------------------+ 

2019.06.27 14:20:36.265 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:35.700 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:35.427 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:34.758 test EURUSD,H1: inicializado

 
Igor Makanu:

es decir, que a pesar de aplicar la plantilla, hay que asignar el tipo

A<double> MyStructDouble;

Y con las clases, cómo sería este código, aplicar una plantilla a una clase.

 
Seric29:

es decir, que a pesar de aplicar la plantilla, hay que asignar el tipo

Y con las clases cómo sería este código, aplicar una plantilla a una clase.

C++ se basa en MQL, todos los lenguajes tipo C son estrictamente tipados - google para ayudar.

Exactamente como en mi ejemplo, sustituye struct por class