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

 
Maxim Kuznetsov:

algo así:

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Utilizar un vector como buscador de niveles es un error.... no es bueno ....((

Y si hacemos que un caballo se mueva)

En la búsqueda de niveles se utiliza el principio de la suma de beneficios en el nivel de precios cuyo registro ya existe...

Por ejemplo: aquí hemos hecho un intento y hemos sumado los beneficios con un retraso de 60 segundos

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

A continuación, tenemos que llegar a un registro :

Si el número de beneficios acumulados en el nivel > 1, entonces esta es nuestra orden - nuestro nivel, desde este nivel dibujamos un rayo

 

Saludos.

Estoy planeando un EA con funciones que en cada tick haga un bucle con las órdenes disponibles creadas por él y actúe dependiendo de la situación.

¿Pueden aconsejar cómo hacer variables separadas para cada nuevo pedido y para que los bucles posteriores trabajen con ellas? (Supongo que es algo así como Peremennaja+ticket=12345;)

 
Andrey Sokolov:

Saludos.

Estoy planeando un EA con funciones que en cada tick haga un bucle con las órdenes disponibles creadas por él y actúe dependiendo de la situación.

¿Pueden aconsejar cómo hacer variables separadas para cada nuevo pedido y para que los bucles posteriores trabajen con ellas? (Supongo que es algo así como Peremennaja+ticket=12345;)

Preferiblemente un array o incluso un array de estructuras.
 
Alexey Viktorov:
Mejor un array o incluso un array de estructuras.

Lo siento, ¿puede explicarlo?
 
Andrey Sokolov:

Disculpe, ¿podría entrar en más detalles?


Aquí y aquí.

Se crea una estructura y un array de tipo estructura. Fuera de todo el código.

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Hola.

Por favor, ayúdeme a encontrar la intersección de la línea horizontal"ResisL" yla línea de tendencia por el ángulo"TrndL"

TRA
 
Nikolay Fedyay:

Hola.

Por favor, ayúdeme a encontrar la intersección de la línea horizontal"ResisL" yla línea de tendencia por el ángulo"TrndL"

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Si conoce dos puntos de coordenadas de la línea de pendiente y los pega como parámetros de esta función, la salida le dará el precio del punto de la barra_a_buscar. Sólo queda llamar a esta función en el bucle de la barra y comparar el valor que devuelve con el precio de la línea horizontal. Si en la última barra del ciclo el valor devuelto por la función era inferior o igual al precio de la línea horizontal, y en la barra actual del ciclo el valor devuelto por la función es mayor que el precio de la línea, entonces las coordenadas X del punto de intersección serán el tiempo correspondiente al índice del ciclo y las coordenadas Y serán el precio devuelto por la función.
 
Artyom Trishkin:

Gracias.

¿Qué tal si quiere saber el punto de cruce cuando todavía no hay barras, es decir, una fecha en el futuro?

 
Nikolay Fedyay:

Gracias.

¿Qué tal si quiere saber el punto de cruce cuando todavía no hay barras, es decir, una fecha en el futuro?

No he probado esta función, tengo que experimentar.

 
Artyom Trishkin:

No he probado esta función, tengo que experimentar.

Por favor, si encuentras tiempo para experimentar, comparte el resultado.

Porque no tengo ni idea de qué experimentar
.