[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 718

 
Roger:
Você lê o arquivo linha por linha e atribui valores a suas variáveis a cada vez. Quando o arquivo terminar, as variáveis terão os últimos valores.

Como implementar isto?

Não consigo descobrir o que usar

 
zheleznii:

Como implementar isto?

Não consigo descobrir o que usar


Muito já foi escrito e reescrito sobre isso, tente https://www.mql5.com/ru/forum/118349
 

Boa noite novamente! Comecei recentemente a escrever um EA com várias moedas que abre pedidos em um par de moedas e abre pedidos em outro par.

Arranquei a parada mais próxima da EA e comecei a brincar com ela, mas ela não funcionou. Aqui está o 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("трал сдвинут");
         } 
      } 
}

aqui está o que não consigo descobrir. Como o Expert Advisor é um Expert Advisor com várias moedas, ele abre pedidos de moedas de maneira imprevisível e às vezes os abre em um mesmo momento para várias moedas.

No código de rastreamento calculo ordens abertas para(int i=0; i<OrdensTotal(); i++) e vai além da seleção de ordens OrderSelect etc. Entendo que cada ordem aberta para um determinado par de moedas requer lances de dados, pedidos, etc. Mas aqui eu quero descobrir quais dados carregar e como selecionar uma ordem para mudanças. Tenho apenas uma variante em minha mente, a pior é escrever um trailing stop para cada moeda ) Por favor, informe o que pode ser feito.

 
Infinity:

Boa noite novamente! Comecei recentemente a escrever um EA com várias moedas que abre pedidos em um par de moedas e abre pedidos em outro par.

Arranquei a parada mais próxima da EA e comecei a brincar com ela, mas ela não funcionou. Aqui está o código:

aqui está o que não consigo descobrir. Como este EA é um Expert Advisor de várias moedas, ele abre pedidos para moedas de maneira imprevisível e às vezes abre pedidos para várias moedas em um mesmo momento.

No código de rastreamento calculo ordens abertas para(int i=0; i<OrdensTotal(); i++) e ainda vai mais longe a seleção de ordens OrderSelect etc. Entendo que cada ordem aberta para um determinado par de moedas requer lances de dados, pedidos, etc. Mas aqui eu quero descobrir quais dados carregar e como selecionar uma ordem para mudanças. Tenho apenas uma variante em minha mente, a pior é escrever um trailing stop para cada moeda ) Por favor, informe o que pode ser feito.

Tente passar um símbolo de ferramenta para o código da rede de arrasto. Então, para cada par você chamará de arrasto.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Bem e com base no valor sy, atribuir outros valores a dados de símbolos específicos... O mesmo Ask with Bid, por exemplo...
 

Infinity:

Eu não entendo bem a tecnologia, como ela funcionará


 
Roger:

Muito já foi escrito e reescrito sobre o assunto - tente https://www.mql5.com/ru/forum/118349.

int a1;

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

FileClose(handle);

No arquivo a1=5;

Eu não entendo o básico.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
aqui atribuímos o valor 5 a a1

FileClose(handle);

muito necessário

 
Infinity:
Atribuir valores às variáveis no código de arrasto com base nos dados do par passado para a função. Você precisa finalizar o código da rede de arrasto... Por exemplo, a variável Bid não deve ser apenas declarada,

mas declarado com um valor atribuído a ele:

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

Consequentemente

bid=MathRound(Bid/Point);

já deveria ser escrito de outra forma, por exemplo:

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

Ou criar outra variável, por exemplo, PriceBid e escrever

PriceBid=MathRound(Bid/Point);

e depois usar o PriceBid em vez do Bid no código.

Procure em todos os seus códigos e use variáveis para um determinado símbolo quando necessário.
E este símbolo você passará para a função de arrasto ao chamá-la:

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

ou

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

É mais claro?

 
artmedia70:
Atribuir valores às variáveis no código de arrasto com base nos dados do par passado para a função. Você precisa finalizar o código da rede de arrasto... Por exemplo, a variável Bid não deve ser apenas declarada,

mas declarado com um valor atribuído a ele:

Correspondentemente

já deveria ser escrito de outra forma, por exemplo:

Ou criar outra variável, por exemplo, PriceBid e escrever

e depois usar PriceBid em vez de Bid no código.

Procure em todo seu código e use a busca de valores variáveis para um determinado símbolo quando necessário.
E este símbolo você passará para a função de arrasto ao chamá-la:

ou

É mais claro?





A única coisa que não entendo é qual par de moedas deve ser enviado para mim em qual momento. Não sei onde obter informações de que, por exemplo, 4 pedidos estão abertos em tais pares e que estes pares devem ser enviados para mim.

Eu não sei se estou fazendo direito ou não... de qualquer forma ....

в блоке 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("трал сдвинут");
         } 
      } 
}

Mas por alguma razão eu recebi um erro EURUSD: divisão zero - este erro provavelmente significa em algum lugar na variável 0, provavelmente durante uma operação do tipo divisão. Estou tentando implementá-lo corretamente?

 
zheleznii:

int a1;

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

FileClose(handle);
No arquivo a1=5;

Por favor, explique - completando a proposta

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
aqui atribuímos o valor 5 a a1

FileClose(handle);

Eu realmente preciso disso.

Portanto, em ordem.

Se apenas os últimos dados são necessários, então por que salvar os anteriores? ("antes de escrever" ocorre com a combinação dos modos FILE_READ|FILE_WRITE).
Portanto, é mais lógico usar FILE_CSV|FILE_WRITE mode, onde os registros anteriores são apagados antes de escrever novos dados.

Vamos começar a escrever 4 variáveis para o arquivo.

//+------------------------------------------------------------------+
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);           
}
//+------------------------------------------------------------------+

O principal é lembrar a ordem na qual as variáveis são escritas, pois esta é a ordem em que as leremos.

Vamos começar a ler os dados em variáveis do arquivo.

//+------------------------------------------------------------------+
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 a função FileReadNumber(), lemos o número após o número na ordem em que foram escritos.
Isso é tudo, nada complicado :)

 
Infinity:


A única coisa que não entendo é qual par de moedas deve ser enviado para mim em qual momento. Onde obtenho a informação de que, por exemplo, 4 pedidos estão abertos em tais pares e que estes pares devem ser enviados para mim?

Eu não sei se estou fazendo direito ou não ... de qualquer forma ....

Mas eu tenho EURUSD: zero erro de divisão. Aparentemente, este erro diz que eu tenho 0 em uma variável em algum lugar, provavelmente, é uma operação de divisão. Estou mesmo tentando implementá-lo corretamente?

Faça a revisão após cada atribuição variável, ou antes de cada operação de divisão, para ver onde você obtém um zero, e então comece a partir daí.
Razão: