[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 718

 
Roger:
Читаете файл построчно и каждый раз присваиваете значения своим переменным. Когда файл закончится, переменные будут иметь последние значения.

Как это реализовать?

Не могу понять что использовать

  • FileReadArray
  • FileReadDouble
  • FileReadInteger
  • FileReadNumber
  • FileReadString и каким образом.Никогда их не использовал.
  • Интересуют самые нижние(последние) значения.При перезагрузке компьютера стартовые данные не вводить вручную а считать из файла последние.
 
zheleznii:

Как это реализовать?

Не могу понять что использовать


Очень много уже написано-перенаписано об этом, попробуйте так https://www.mql5.com/ru/forum/118349
 

И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга. 

Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:

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

а вот чего понять мне не удаеться. Поскольку советник - мультик, он открывает ордера по валютам не предсказуемо и бывает так, что в один и тот же момент на нескольких валютах.

 В коде трейлинга  идет подсчет открытых ордеров  for (int i=0; i<OrdersTotal(); i++) ну и дальше идет выборка ордера OrderSelect и тд, я понимаю что для каждого открытого ордера по определенной паре для изменений требуется получение данных bid, ask  ну и тд.  вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.

 
Infinity:

И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга.

Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:

а вот чего понять мне не удаеться. Поскольку советник - мультик, он открывает ордера по валютам не предсказуемо и бывает так, что в один и тот же момент на нескольких валютах.

В коде трейлинга идет подсчет открытых ордеров for (int i=0; i<OrdersTotal(); i++) ну и дальше идет выборка ордера OrderSelect и тд, я понимаю что для каждого открытого ордера по определенной паре для изменений требуется получение данных bid, ask ну и тд. вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.

Попробуйте передавать в код трала символ инструмента. Тогда для каждой пары будете вызывать трал.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Ну и исходя из значения sy присваивайте другим значениям данные конкретного символа... Те же Ask с Bid`ом, например...
 

Infinity:

что то несовсем понял технологию, как это будет работать 


 
Roger:

Очень много уже написано-перенаписано об этом, попробуйте так https://www.mql5.com/ru/forum/118349

int a1;

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

FileClose(handle);

В файле a1=5;

Непонимание в азах.Прошу объяснить - дописав предложенное

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
здесь присваивается a1 значение 5

FileClose(handle);

очень надо

 
Infinity:
Присваивайте значения переменным в коде трала исходя из данных по переданной в функцию паре. Вам нужно доделать код трала... Например переменная Bid должна не просто объявляться,

а объявляться с присвоением ей значения:

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

Соответственно

bid=MathRound(Bid/Point);

нужно уже записывать иначе, например:

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

Либо создать ещё одну переменную, например PriceBid и записывать

PriceBid=MathRound(Bid/Point);

и уже далее в коде вместо Bid использовать PriceBid...

Просмотрите весь свой код и, где необходимо, используйте получения значений переменных для конкретного символа.
А символ этот вы будете передавать в функцию трала при её вызове:

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

или

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

Так понятней?

 
artmedia70:
Присваивайте значения переменным в коде трала исходя из данных по переданной в функцию паре. Вам нужно доделать код трала... Например переменная Bid должна не просто объявляться,

а объявляться с присвоением ей значения:

Соответственно

нужно уже записывать иначе, например:

Либо создать ещё одну переменную, например PriceBid и записывать

и уже далее в коде вместо Bid использовать PriceBid...

Просмотрите весь свой код и, где необходимо, используйте получения значений переменных для конкретного символа.
А символ этот вы будете передавать в функцию трала при её вызове:

или

Так понятней?





так понятно даже очень. только одного не могу понять, какую валютную пару мне передавать в какой момент. откуда взять информацию о том, что открыто к примеру 4 ордера по таким-то парам, и что именно эти пары следует передавать.

Незнаю, правильно я делаю или нет,.. вообщем ....

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

но почемуто в итоге получаю ошибку EURUSD,: zero divide - эта ошибка видимо говорит что гдето в переменной 0, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?

 

 
zheleznii:

int a1;

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

FileClose(handle);
В файле a1=5;

Непонимание в азах.Прошу объяснить - дописав предложенное

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
здесь присваивается a1 значение 5

FileClose(handle);

очень надо

Итак, по порядку.

Если нужны только последние данные, зачем тогда сохранять предыдущие? ("до запись" происходит при комбинации режимов FILE_READ|FILE_WRITE).
Поэтому логичнее использовать режим FILE_CSV|FILE_WRITE в нем предыдущие записи удаляются перед записью новых данных.

Начинаем запись 4-х переменных в файл.

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

Главное запомнить порядок записи переменных, так как в этом же порядке мы будем их считывать. 

Начинаем считывать данные в переменные из файла.

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

С помощью функции FileReadNumber() считываем последовательно цифру за цифрой, в том порядке, в котором записали.
Собственно вот и все, ничего сложного :)

 
Infinity:


так понятно даже очень. только одного не могу понять, какую валютную пару мне передавать в какой момент. откуда взять информацию о том, что открыто к примеру 4 ордера по таким-то парам, и что именно эти пары следует передавать.

Незнаю, правильно я делаю или нет,.. вообщем ....

но почемуто в итоге получаю ошибку EURUSD,: zero divide - эта ошибка видимо говорит что гдето в переменной 0, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?

Сделайте распринтовку после каждой операции присвоения значения переменным, либо перед каждой операцией деления, чтобы определить где нолик у вас попадается и далее уже от этого и плясать.
Причина обращения: