И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга.
Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:
// ну так сообственно вызываю функцию - 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 ну и тд. вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.
И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга.
Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:
а вот чего понять мне не удаеться. Поскольку советник - мультик, он открывает ордера по валютам не предсказуемо и бывает так, что в один и тот же момент на нескольких валютах.
В коде трейлинга идет подсчет открытых ордеров for (int i=0; i<OrdersTotal(); i++) ну и дальше идет выборка ордера OrderSelect и тд, я понимаю что для каждого открытого ордера по определенной паре для изменений требуется получение данных bid, ask ну и тд. вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.
Попробуйте передавать в код трала символ инструмента. Тогда для каждой пары будете вызывать трал.
void TrailingStop(string sy)
if (sy == "" || sy == "0") sy = Symbol();
Ну и исходя из значения sy присваивайте другим значениям данные конкретного символа... Те же Ask с Bid`ом, например...
Присваивайте значения переменным в коде трала исходя из данных по переданной в функцию паре. Вам нужно доделать код трала... Например переменная 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...
Просмотрите весь свой код и, где необходимо, используйте получения значений переменных для конкретного символа. А символ этот вы будете передавать в функцию трала при её вызове:
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, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?
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() считываем последовательно цифру за цифрой, в том порядке, в котором записали. Собственно вот и все, ничего сложного :)
так понятно даже очень. только одного не могу понять, какую валютную пару мне передавать в какой момент. откуда взять информацию о том, что открыто к примеру 4 ордера по таким-то парам, и что именно эти пары следует передавать.
Незнаю, правильно я делаю или нет,.. вообщем ....
но почемуто в итоге получаю ошибку EURUSD,: zero divide - эта ошибка видимо говорит что гдето в переменной 0, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?
Сделайте распринтовку после каждой операции присвоения значения переменным, либо перед каждой операцией деления, чтобы определить где нолик у вас попадается и далее уже от этого и плясать.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Читаете файл построчно и каждый раз присваиваете значения своим переменным. Когда файл закончится, переменные будут иметь последние значения.
Как это реализовать?
Не могу понять что использовать
Как это реализовать?
Не могу понять что использовать
Очень много уже написано-перенаписано об этом, попробуйте так https://www.mql5.com/ru/forum/118349
И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга.
Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:
а вот чего понять мне не удаеться. Поскольку советник - мультик, он открывает ордера по валютам не предсказуемо и бывает так, что в один и тот же момент на нескольких валютах.
В коде трейлинга идет подсчет открытых ордеров for (int i=0; i<OrdersTotal(); i++) ну и дальше идет выборка ордера OrderSelect и тд, я понимаю что для каждого открытого ордера по определенной паре для изменений требуется получение данных bid, ask ну и тд. вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.
И снова доброй ночи! Не так давно начал писать мультивалютный советник, который находясь на одной валюте открывает ордера и на других и столкнулся с проблеммой, в реализации трейлинга.
Выдрал ближайший трал из эксперта и начал мудрить, но ничего не получается. Вот код:
а вот чего понять мне не удаеться. Поскольку советник - мультик, он открывает ордера по валютам не предсказуемо и бывает так, что в один и тот же момент на нескольких валютах.
В коде трейлинга идет подсчет открытых ордеров for (int i=0; i<OrdersTotal(); i++) ну и дальше идет выборка ордера OrderSelect и тд, я понимаю что для каждого открытого ордера по определенной паре для изменений требуется получение данных bid, ask ну и тд. вот тут то и загводка, а как же функции узнавать какие данные с какой валюты загружать и как он будет ордер выбирать для изменений? У меня в голове только один вариант, самый плохой написать трайлинг для каждой валюты ) . подскажите что можно сделать. я так понимаю это не только трейлинга касается это так же равнозначно и для функции закрытия ордера.
Infinity:
что то несовсем понял технологию, как это будет работать
Очень много уже написано-перенаписано об этом, попробуйте так 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);
очень надо
а объявляться с присвоением ей значения:
int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;Соответственно
нужно уже записывать иначе, например:
Либо создать ещё одну переменную, например PriceBid и записывать
и уже далее в коде вместо Bid использовать PriceBid...
Просмотрите весь свой код и, где необходимо, используйте получения значений переменных для конкретного символа.
А символ этот вы будете передавать в функцию трала при её вызове:
TrailingStop(""); // Тралим символ графикаили
Так понятней?
Присваивайте значения переменным в коде трала исходя из данных по переданной в функцию паре. Вам нужно доделать код трала... Например переменная Bid должна не просто объявляться,
а объявляться с присвоением ей значения:
Соответственно
нужно уже записывать иначе, например:
Либо создать ещё одну переменную, например PriceBid и записывать
и уже далее в коде вместо Bid использовать PriceBid...
Просмотрите весь свой код и, где необходимо, используйте получения значений переменных для конкретного символа.
А символ этот вы будете передавать в функцию трала при её вызове:
или
Так понятней?
так понятно даже очень. только одного не могу понять, какую валютную пару мне передавать в какой момент. откуда взять информацию о том, что открыто к примеру 4 ордера по таким-то парам, и что именно эти пары следует передавать.
Незнаю, правильно я делаю или нет,.. вообщем ....
но почемуто в итоге получаю ошибку EURUSD,: zero divide - эта ошибка видимо говорит что гдето в переменной 0, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?
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-х переменных в файл.
Главное запомнить порядок записи переменных, так как в этом же порядке мы будем их считывать.
Начинаем считывать данные в переменные из файла.
С помощью функции FileReadNumber() считываем последовательно цифру за цифрой, в том порядке, в котором записали.
Собственно вот и все, ничего сложного :)
так понятно даже очень. только одного не могу понять, какую валютную пару мне передавать в какой момент. откуда взять информацию о том, что открыто к примеру 4 ордера по таким-то парам, и что именно эти пары следует передавать.
Незнаю, правильно я делаю или нет,.. вообщем ....
но почемуто в итоге получаю ошибку EURUSD,: zero divide - эта ошибка видимо говорит что гдето в переменной 0, наверное при операции типа деления. Я вообще правильно пытаюсь реализовать ?