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

 
Vitaly Muzichenko #:

Intervengo :)

Hay un índice DAX30 = cotizado de 9 a 22

¿Cuál es la manera de saber cuántas barras hay en una sesión en el marco de tiempo M15, H1, etc.?

Maxim Kuznetsov #:

(22*3600-9*3600)/PeriodSeconds(M15)

pero esto es idealmente "este número de barras debe estar entre las 9:00 y las 22:00".

Cuanto más pequeño es el plazo, mayor es el error, en realidad casi siempre es menor. No se puede utilizar el historial para calcular "la siguiente sesión cada N barras".

Es mucho más sencillo...

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Buenas tardes a todos.

Necesito tu ayuda.

El EA tiene una función de recuento incorporada para el beneficio actual:

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick se realiza como en el caso anterior.

Cómo hacer que el contador de beneficios se ponga a 0,0 si se cumplen las condiciones:

if(CountOrders()==0) && (GetProfitFromStart()>0

es decir, ¿se cierran todas las órdenes y el beneficio total cuando se cierra la última orden era >0?

 

Instalado MT4. No guarda las comillas después de cerrar el terminal - carga una nueva cada vez.

 
Maxim Kuznetsov #:

incluso en la 4, es mejor"abrir primero, modificar después".

No todos permiten abrir en el mercado con un Stop Loss al mismo tiempo.

Por cierto, el stop loss no se produce en todas partes. Si quieres operar con una orden de stop-loss tienes que comprobarlo en el servidor del broker, es su servicio personal (crédito, riesgo, ganancias), no donde tú crees que está, no hay ningún canal de negociación de órdenes de stop-loss.

Gracias, sí, incluso la demo en diferentes brokers muestra condiciones demasiado diferentes.

 
законопослушный гражданин #:

Buenas tardes a todos.

Necesito tu ayuda.

El EA tiene una función de recuento incorporada para el beneficio actual:

void OnTick se compone como en el caso anterior.

Cómo hacer que el contador de beneficios se ponga a 0,0 cuando se cumplan las condiciones:

if(CountOrders()==0) && (GetProfitFromStart()>0

Es decir, ¿se cierran todas las órdenes y el beneficio total cuando se cierra la última orden era >0?

Esta tarea no está del todo clara. Cada vez la función de cálculo comienza a recorrer las órdenes/posiciones y resume las ganancias desde cero.

 double lp=0,cp=0;

¿Qué quieres eliminar? Si no tiene posiciones abiertas/órdenes de mercado, la función de recuento devolverá cero. Se pondrá a cero por sí mismo))

 
законопослушный гражданин #:

Buenas tardes a todos.

Necesito tu ayuda.

Cómo hacer que el contador de beneficios se ponga a 0,0 cuando se cumplan las condiciones:

es decir, todas las órdenes se cerraron y el beneficio total cuando la última orden se cerró era >0???

¿Qué es exactamente lo que no funciona?

 

Buenas tardes. Por favor, ayuda.

Buscando órdenes cerradas con rendimientos negativos.
Por totales falla, no me sale el resultado de todas las órdenes negativas.

Estoy aprendiendo a escribir.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Buenas tardes. Por favor, ayuda.

Buscando órdenes cerradas con rendimientos negativos.
Por totales falla, no me sale el resultado de todas las órdenes negativas.

Estoy intentando aprender a escribir.

En un vistazo rápido, veo que estás mirando las posiciones desde el final y al mismo tiempo, escribes la hora de cierre en la variable. Puede resultar que haya capturado el tiempo de la posición cerrada más recientemente y la siguiente condición ya no será cierta:

OrderCloseTime()>=time

ya que otras posiciones tienen tiempos de cierre más bajos. Todo dependerá de la clasificación, pero en la clasificación estándar este es el problema.


También se debe arreglar esta condición

(OrderType() == OP_BUY || OP_SELL)

a

(OrderType() == OP_BUY || OrderType() == OP_SELL)

Si tomamos una posición del histórico, OrderProfit() ya almacenará el resultado final con swaps y comisión. En posiciones abiertas - no, todo debe ser resumido. Pero esto no es seguro, compruébalo.

 
Nikita Chernyshov #:

En un vistazo rápido, veo que estás mirando las posiciones desde el final y estás escribiendo la hora de cierre en la variable. Puede resultar que haya capturado el tiempo de la posición cerrada más recientemente y la siguiente condición ya no será cierta:

ya que otras posiciones tienen tiempos de cierre más bajos. Todo dependerá de la clasificación, pero en la clasificación estándar este es el problema.


También se debe arreglar esta condición

a

Si tomamos una posición del historial, OrderProfit() ya almacenará el resultado final con swaps y comisión. En posiciones abiertas - no, todo debe ser resumido. Pero esto no es exacto, por favor, compruébelo.

Gracias. Esto funciona bien.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

Además; cuando nos encontremos con una orden con un beneficio positivo, debemos reiniciar el resultado y buscar los negativos.

 
Alexander Avksentyev #:

Buenas tardes. Por favor, ayuda.

Buscando órdenes cerradas con rendimientos negativos.
Por totales falla, no me sale el resultado de todas las órdenes negativas.

Estoy aprendiendo a escribir.

Recomiendo usar un depurador para esta y otras situaciones similares.

Razón de la queja: