[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 317

 
enya:

.

en la inserción. problemas con el ciclo y el restablecimiento de los valores iniciales después de salir del ciclo

Esta es la función que responderá si la última operación fue rentable o no:

 double LastOrderProfit()
 {
   double Profit=0;
   int ticket; 
   for(int i=0; i<OrdersHistoryTotal(); i++){
     if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()!=Symbol())continue;
     if(OrderMagicNumber()!=Magic)continue;
     if(OrderType()>1)continue;
     if(ticket<OrderTicket()){
        ticket=OrderTicket();
        Profit=OrderProfit()+OrderSwap()+OrderCommission();
     } 
   }     
 return(Profit);
 } 

A continuación, comparando su respuesta con el cero, se decide si se deja el TP/SL igual o se cambia.

 if(LastOrderProfit()>0) newTPSL=false; else  newTPSL=true;
if(newTPSL)OrderModify(.......newSL,newTP...);
 

Hola a todos. Estoy interesado en el indicador IN10TION NewsReader. Quiero adjuntarlo a mi EA.

Si aparece una línea roja (Market.TdOpen) y Market.Price.DOWN(red) entonces vende

Si aparece una línea roja (Market.TdOpen) y Market.Price.UP(green) entonces compre

¿Qué medidas puedo tomar? ¡He probado con iCustom pero no funciona!


extern bool Market.TdOpen = TRUE;
extern color Market.TdOpen.Color = Red;
extern bool Market.TdFibo = TRUE;
extern color Market.TdFibo.Color = C'0x00,0x32,0x00';
extern color Market.Price.UP = Lime;
extern color Market.Price.DOWN = Red;
extern bool Market.Price.Guide = TRUE;

Archivos adjuntos:
_yIN10TIONfNewsReaderov09.99kblite.ex4 (115.59 KB) borrar

 

Disculpas a los administradores por repetirme, pero nadie me ha dicho ni media palabra todavía. La idea es dar salida a los mensajes almacenados en los registros, es decir, aquellos que no pueden ser fijados correctamente por la función IsConnected() - fallos de conexión, peticiones. De lo contrario, no está claro por qué el EA no está haciendo nada en este momento.


Por favor, sugiera el siguiente código para leer el archivo de registro. Lee automáticamente el archivo de registro actual por fecha y lo envía a la impresora.

Dónde:

while (result>0) {

Se está ensamblando un archivo a partir de piezas. Pero no necesito todo el archivo, sólo la última línea. Ayuda para corregirlo, por favor.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 

Necesito ayuda para cambiar un EA

El Asesor Experto debe operar en sentido inverso.

En lugar de órdenes de venta a precio limitado, compre

y las órdenes de compra limitadas venden

Archivos adjuntos:
tke.mq4  18 kb
 
mersi:

Esta es la función que responderá si la última operación fue rentable o no:

Luego, comparando su respuesta con el cero, se decide dejar TP/SL igual o cambiarlos.

¿Su función está segura de devolver el último pedido? ¿O devolverá el primer pedido que no fue perdedor? ¿Por qué hay una marca en el billete?

Yo lo haría así:

//+----------------------------------------------------------------------------+
double LastOrderProfit() {
   double Profit=0;
   datetime t;
   int i, j;
   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderMagicNumber()!=Magic)                  continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderType()>1)                              continue;
      if (t<OrderCloseTime()) {
         t=OrderCloseTime();
         j=i;
         }
      }
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
   return(Profit);
} 
//+----------------------------------------------------------------------------+

Esto es un rediseño de su función para encontrar exactamente el último pedido cerrado.

Tiene la desventaja de que si no hubo ninguna orden cerrada, devolverá cero. Por lo tanto, utilizándolo, es imposible saber con seguridad si hay o no hay órdenes cerradas en el historial. Al fin y al cabo, el cero devuelto no indica que no haya ningún pedido, sino que está cerrado a cero.

 

Por favor, avisa:

está interesado en la representación del valor del indicador sólo para último (actual) bar. Sin embargo, al abrir una nueva barra, los valores antiguos permanecen en el gráfico.... ¿Cómo puedo eliminar esta basura a la fuerza? ¿Es posible especificar la condición de que para la barra [0] se calculen y muestren los valores del indicador, y para las barras de [1] a [Bar-1] se restablezcan estos valores?

double Buffer [1];            

int init()
  {

   IndicatorBuffers(1);
  
   SetIndexStyle(0,DRAW_ARROW);
   .........
 
   return(0);
  }

int deinit()
  {
   return(0);
  }

int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) counted_bars=0;
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
       for(int i=limit;i>=0;i--) 
     {
         Buffer [0] = ............;
     }
   return(0);
  }        
 

artmedia70:

Tiene el inconveniente de que si no se ha cerrado ninguna orden, devolverá cero. Por lo tanto, utilizándolo, es imposible saber con seguridad si hay o no hay órdenes cerradas en el historial. Al fin y al cabo, el nulo devuelto no significa que la orden no exista en absoluto, sino que está cerrada a cero.

Gracias. Aunque no me has contestado, has respondido a mi pregunta anterior sobre el cálculo correcto del beneficio:

Profit=OrderProfit()+OrderSwap()+OrderCommission();
 
Azerus:

Por favor, avisa:

está interesado en la representación del valor del indicador sólo para último (actual) bar. Sin embargo, al abrir una nueva barra, los valores antiguos permanecen en el gráfico.... ¿Cómo puedo eliminar esta basura a la fuerza? ¿Es posible especificar la condición de que para la barra [0] se calculen y muestren los valores del indicador, y para las barras de [1] a [Bar-1] se restablezcan estos valores?

Al comienzo de Start(), inicializa el buffer con el valor EMPTY_VALUE. Es decir, hacerlo con la aparición de una nueva barra, comprobar el tiempo de apertura de la barra cero y hacer su lógica de limpieza de basura.

 
artmedia70:

¿Su función está segura de devolver el último pedido? ¿O el primero que se encuentra no es poco rentable? ¿Por qué hay una marca en el billete?

Yo lo haría así:

Se trata de una conversión de su función para encontrar exactamente el último pedido cerrado.

Tiene una desventaja: si no hay órdenes cerradas, devolverá cero. Por lo tanto, al utilizarlo, no podemos saber con seguridad si hay órdenes cerradas o no en el historial. El nulo devuelto no indica en absoluto la ausencia de la orden, pero sí que se cerró a cero.

1. La función encuentra la orden con el ticker más grande en el historial, lo que significa la última orden cerrada (a menos que, por supuesto, tomemos algún caso excepcional, para lo cual es preferible su variante con el tiempo máximo de cierre).

2. Según las condiciones , la primera orden se abre con el TP/SL especificado y sólo la segunda orden puede abrirse con el nuevo TP/SL, lo que significa que la función puede devolver cero sólo si la primera operación fue cero, pero no si no hay órdenes cerradas en el historial.

Una última cosa. En tu variante el uso de j y otro SELECT en la función es redundante.

es suficiente:

 if (t<OrderCloseTime()) {
         t=OrderCloseTime();
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
  }
   return(Profit);
 
snail09:
Al principio de Start() inicializar el buffer con el valor EMPTY_VALUE.


¿Cómo es esto? Tengo esto en la configuración de la línea del indicador después de int init()

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,165);                     
   SetIndexBuffer(0,Buffer);
   SetIndexEmptyValue(0,0.0);
Razón de la queja: