[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 718

 
Roger:
Usted lee el archivo línea por línea y asigna valores a sus variables cada vez. Cuando el archivo termine, las variables tendrán los últimos valores.

¿Cómo ponerlo en práctica?

No sé qué usar

 
zheleznii:

¿Cómo ponerlo en práctica?

No se sabe qué usar


Ya se ha escrito y reescrito mucho sobre esto, pruebe con https://www.mql5.com/ru/forum/118349
 

¡Buenas noches de nuevo! Recientemente he comenzado a escribir un EA multidivisa que abre órdenes en un par de divisas y abre órdenes en otro.

Arranqué el trailing stop más cercano del EA y empecé a jugar con él pero no funcionó. Aquí está el código:

// ну так сообственно вызываю функцию - TrailingStop();
//вот что в функции
 void TrailingStop()
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()!=Symbol()) continue; 
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(Bid/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(Ask/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

esto es lo que no puedo entender. Dado que el Asesor Experto es un Asesor Experto multidivisa, abre órdenes para divisas de manera impredecible y a veces las abre en un mismo momento para varias divisas.

En el código de seguimiento calculo las órdenes abiertas para(int i=0; i<OrdersTotal(); i++) y luego va la selección de órdenes OrderSelect, etc. Entiendo que cada orden abierta para un determinado par de divisas requiere los datos bid, ask, etc. Pero aquí quiero saber qué datos deben descargarse y cómo voy a seleccionar una orden para los cambios? Sólo tengo una variante en mi mente, la peor es escribir un trailing stop para cada moneda ) Por favor, aconsejar lo que se puede hacer.

 
Infinity:

¡Buenas noches de nuevo! Recientemente he comenzado a escribir un EA multidivisa que abre órdenes en un par de divisas y abre órdenes en otro.

Arranqué el trailing stop más cercano del EA y empecé a jugar con él pero no funcionó. Aquí está el código:

esto es lo que no puedo entender. Dado que el Asesor Experto es un Asesor Experto multidivisa, abre órdenes para divisas de manera impredecible y a veces las abre en un mismo momento para varias divisas.

En el código de seguimiento calculo las órdenes abiertas para(int i=0; i<OrdersTotal(); i++) y luego va la selección de órdenes OrderSelect, etc. Entiendo que cada orden abierta para un determinado par de divisas requiere los datos bid, ask, etc. Pero aquí quiero saber qué datos deben descargarse y cómo voy a seleccionar una orden para los cambios? Sólo tengo una variante en mi mente, la peor es escribir un trailing stop para cada moneda ) Por favor, aconsejar lo que se puede hacer.

Intenta pasar un símbolo de herramienta en el código de la red de arrastre. Luego, para cada par, llamará a la red de arrastre.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Bien y en base al valor de sy asignar otros valores a los datos específicos del símbolo... Lo mismo Pregunta con Bid, por ejemplo...
 

Infinity:

No entiendo muy bien la tecnología, cómo va a funcionar


 
Roger:

Ya se ha escrito y reescrito mucho sobre el tema: pruebe con https://www.mql5.com/ru/forum/118349.

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);

En el archivo a1=5;

No entiendo lo básico.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
aquí asignamos el valor 5 a a1

FileClose(handle);

muy necesario

 
Infinity:
Asigna valores a las variables en el código de arrastre basándose en los datos del par que se pasa a la función. Necesitas finalizar el código de arrastre... Por ejemplo, la variable Bid no debe ser declarada sin más,

pero declarado con un valor asignado:

int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;

En consecuencia,

bid=MathRound(Bid/Point);

ya debería estar escrito de otra manera, por ejemplo:

bid=MathRound(MarketInfo(sy, MODE_BID)/Point);

O crear otra variable, por ejemplo, PrecioOferta y escribir

PriceBid=MathRound(Bid/Point);

y luego usar PriceBid en lugar de Bid en el código...

Revise todo su código y utilice variables para un símbolo concreto cuando sea necesario.
Y este símbolo lo pasarás a la función de arrastre cuando la llames:

 TrailingStop( EURUSD);     // Тралим ЕвроБаксы
 TrailingStop("");         // Тралим символ графика

o

TrailingStop(NULL);         // Тралим символ графика

¿Está más claro?

 
artmedia70:
Asigna valores a las variables en el código de arrastre basándose en los datos del par que se pasa a la función. Necesitas finalizar el código de arrastre... Por ejemplo, la variable Bid no debe ser declarada sin más,

pero declarado con un valor asignado:

Correspondientemente

ya debería estar escrito de otra manera, por ejemplo:

O crear otra variable, por ejemplo, PriceBid y escribir

y luego usar PriceBid en lugar de Bid en el código...

Revisa todo tu código y utiliza la búsqueda de valores de variables para un símbolo en particular.
Y este símbolo lo pasarás a la función de arrastre cuando la llames:

o

¿Está más claro?





Lo único que no entiendo es qué par de divisas debe enviarme en cada momento. No sé de dónde sacar la información de que, por ejemplo, hay 4 órdenes abiertas en tales pares y que estos pares deben enviarme.

No sé si lo estoy haciendo bien o no... en fin ....

в блоке start  определяю открытые ордера и определяю по каким парам они открыты
 for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()=="EURUSD") {sy="EURUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
      if (OrderSymbol()=="GBPUSD") {sy="GBPUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
       
      } 
  TrailingStop(sy);

а в функции делаю следующее

void TrailingStop(string sy)
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level,point; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()==sy)  
      bid=MarketInfo(sy,MODE_BID);
      ask=MarketInfo(sy,MODE_ASK);
      point=MarketInfo(sy,MODE_POINT);
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(bid/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(ask/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Pero por alguna razón obtuve un error EURUSD: cero dividir - este error probablemente significa en algún lugar de la variable 0, probablemente durante una operación de tipo de división. ¿Estoy tratando de implementarlo correctamente en absoluto?

 
zheleznii:

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);
En el archivo a1=5;

Malentendido en los fundamentos. Por favor, explique - completando la propuesta

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
aquí asignamos el valor 5 a a1

FileClose(handle);

Realmente lo necesito.

Así que, en orden.

Si sólo se necesitan los últimos datos, ¿para qué guardar los anteriores? ("antes de escribir" ocurre con la combinación de los modos FILE_READ|FILE_WRITE).
Por lo tanto, es más lógico utilizar el modo FILE_CSV|FILE_WRITE, en el que se borran los registros anteriores antes de escribir los nuevos datos.

Vamos a empezar a escribir 4 variables en el archivo.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a1 = 3;
   double punkt = 0.4;
   double nn = 1128;
   double mm = 1000;

   handle=FileOpen("a1.csv",FILE_CSV|FILE_WRITE,';');
   FileWrite(handle,a1,punkt,nn,mm);
   FileClose(handle);           
}
//+------------------------------------------------------------------+

Lo principal es recordar el orden en el que se escriben las variables, porque es el orden en el que las leeremos.

Comencemos a leer los datos en las variables desde el archivo.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a;
   double p;
   double n;
   double m;   
   handle=FileOpen("a1.csv",FILE_CSV|FILE_READ, ';');         
   
   a = FileReadNumber(handle);    //считываем первую цифру, соответствующую переменной a1 и далее по порядку...
   p = FileReadNumber(handle);    //punkt
   n = FileReadNumber(handle);    //nn
   m = FileReadNumber(handle);    //mm
   
   FileClose(handle);           
}
//+------------------------------------------------------------------+

Usando la función FileReadNumber(), leemos el número después del número en el orden en que fueron escritos.
Eso es todo, nada complicado :)

 
Infinity:


Lo único que no entiendo es qué par de divisas debe enviarme en cada momento. ¿De dónde saco la información de que, por ejemplo, hay 4 órdenes abiertas en tales pares y que estos pares deben enviarme?

No sé si lo estoy haciendo bien o no... en fin ....

Pero tengo EURUSD: error de división cero. Aparentemente, este error dice que tengo 0 en una variable en algún lugar, probablemente, es una operación de división. ¿Estoy tratando de implementarlo correctamente?

Haga una revisión después de cada operación de asignación de variables, o antes de cada operación de división, para ver dónde obtiene un cero, y luego comience desde allí.