Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:
1) в ините создаем переменную AllowNewOrders (если ее нет)
2) создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа
3) пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders
4) при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий
[отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]
5) если пункт 4 не выполняется, значит можно открывать новые ордера.
Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...
intOnInit()
{
if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------voidOnTick()
{
if (CountTrades() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
elseGlobalVariableSet("AllowNewOrders", 1);
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
elseGlobalVariableSet("AllowNewOrders", 1);
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)
// Если последняя сделка прибыльная или это первая сделка, то открывается ордер
{
if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
if (SignalBuy())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
}
}
}
Здравствуйте! Подскажите пожалуйста при использовании функции из поста (каждому ордеру свой магик) — http://forum.forexpeoples.ru/showthr...=1#post1715092 , как будет выглядеть поиск последних ордеров для продаж или покупок, или модернизации серии ордеров, если не каждому ордеру свой магик, а каждой серии ордеров свой магик. Т.е. предполагается, что когда открывается новая серия ордеров со своим магиком, старые серии продолжают открывать свои ордера со своими магиками. У каждой серии планируется свой профит и таких серий ордеров множества.
Как может изменится код внизу при таких условиях? for(cnt=OrdersTotal()-1;cnt>=0;cnt--){ if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;
Код генерации магика поставил при открытии первых ордеров серий, но вот проблема при открытии новых ордеров в этих же сериях.
Сам код генерации магика из поста: //+------------------------------------------------------------------+ // keekkenen: получаем следующий магик в серии int getNextMagicNumber(){ int magic = EMPTY;
if (OrdersTotal() == 0) { return(startMagicNumber); }
for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){ magic = checkMarketByMagic(i); if (magic != EMPTY) break; }
if (magic == EMPTY){ magic = startMagicNumber; // первый в серии } else { magic++; //следующий в серии }
return(magic); } //+------------------------------------------------------------------+ // keekkenen: проверяем наличие ордера в рынке с заданным магиком int checkMarketByMagic(int magic){ for(int i = 0; i < OrdersTotal(); i++){ if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == magic) return(magic); } return(EMPTY); } //+------------------------------------------------------------------+
Доброго времени суток господа форумчане, извиняюсь если спутал ветки, но куда приткнуть правильно ТЕМУ не нашел, так что не пинайте.
Некоторое время назад просматривая в интернете существующие новинки советников от пользователей, повстречался мне один на который я не обратил внимание, так как по описанию был стандартным, коих привеликое множество, на свою беду не обратил внимание и на название тоже.
Может кто пользуется, кто видел или читал, подскажите хотя бы название, а гугл свое дело сделает или если имеется приму в дар. Может есть схожий советник выполняющий аналогичные действия.
Опишу смысл советника (замудреного нет ничего, чем сейчас мне и необходим).
Если грубо говоря то тех задание выглядело бы так:
1. Открыли позицию в ручную, например buy. 2. Советник выставил ему стоплосс и тейкпрофит по настройкам. 3. Ордер закрылся по тейкпрофиту - советник сразу открывается еще один buy и выставляет ему те же стоплосс и тейкпрофит, до тех пор пока не поймает первый стоплосс либо если есть конечный тейкпрофит. 4. Если позиция закрылась по стоплоссу то робот больше ничего не предпринимает. Советник ждет открытия следующего ордера в ручную.
Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:
1) в ините создаем переменную AllowNewOrders (если ее нет)
2) создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа
3) пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders
4) при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий
[отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]
5) если пункт 4 не выполняется, значит можно открывать новые ордера.
Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...
Спасибо Александр, завтра проверю. [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?] Если MaxOpenOrders>1 на какое то значение, то по идее AllowNewOrders=1 тоже должен быть больше на это же значение. Но с этим можно пока не заморачиваться и MaxOpenOrders убрать вообще, так как в этом варианте программы все равно не планируется больше одной серии.
alvlaf: Спасибо Александр, завтра проверю. [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?] Если MaxOpenOrders>1 на какое то значение, то по идее AllowNewOrders=1 тоже должен быть больше на это же значение. Но с этим можно пока не заморачиваться и MaxOpenOrders убрать вообще, так как в этом варианте программы все равно не планируется больше одной серии.
Попробовал, первые пять минут работал нормально, потом стал открывать одновременно несколько сделок (4) причем по одной и той же паре с увеличенным лотом. Александр, мне не совсем понятно в твоём варианте каким образом глобальная переменная получает и изменяет своё значение?
alvlaf: Попробовал, первые пять минут работал нормально, потом стал открывать одновременно несколько сделок (4) причем по одной и той же паре с увеличенным лотом. Александр, мне не совсем понятно в твоём варианте каким образом глобальная переменная получает и изменяет своё значение?
Так ты начни последовательно. Сначала тест на одной паре все возможные варианты сделок, потом только на нескольких запускай. (4) - это количество сделок?
При запуске советника переменной присваивается 1, если такой переменной нет (в твоем случае она точно есть, т.к. хранится 4 недели). На каждом тике эта переменная разрешает или запрещает новые сделки - вот ее единственный смысл. Если сделка убыточная илм неприбыльная, то AllowNewOrders=0, если нет то =1. Перед проверкой сигналов на покупку/продажу эта переменная проверяется и выкидывает из цикла, не открывая ордера. Еслм по одной паре открывается 4! сделки, да еще с увеличенным лотом, то явно не работает CountTrades. Я сам посмотреть не могу, т.к. там где я нахожусь очень очень очень плохой интернет. И у меня кстати по опционам Grand Capital на любом таймфрейме новый тик приходит только с новой свечой - у тебя так же?
A13ksandr: Так ты начни последовательно. Сначала тест на одной паре все возможные варианты сделок, потом только на нескольких запускай. (4) - это количество сделок?
При запуске советника переменной присваивается 1, если такой переменной нет (в твоем случае она точно есть, т.к. хранится 4 недели). На каждом тике эта переменная разрешает или запрещает новые сделки - вот ее единственный смысл. Если сделка убыточная илм неприбыльная, то AllowNewOrders=0, если нет то =1. Перед проверкой сигналов на покупку/продажу эта переменная проверяется и выкидывает из цикла, не открывая ордера. Еслм по одной паре открывается 4! сделки, да еще с увеличенным лотом, то явно не работает CountTrades. Я сам посмотреть не могу, т.к. там где я нахожусь очень очень очень плохой интернет. И у меня кстати по опционам Grand Capital на любом таймфрейме новый тик приходит только с новой свечой - у тебя так же?
Александр, думаю присваивать глобальной переменной при запуске 1 это не правильно, ведь нужно дождаться пока откроется хотя бы один ордер. По-моему нужно привязать значение AllowNewOrders к OrdersTotal или CountTrades, чтобы она изменялась когда откроется первая серия. Буду сегодня пробовать это сделать, но у меня очень мало опыта, поэтому-то если ты напишешь как это правильно прописать в коде буду тебе очень благодарен. У меня в терминале тики приходят в любой момент текущего бара даже на М1. (4) - это количество это одновременно открытых ботом сделок. И тестировал я так, как ты советуешь.
Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:
1) в ините создаем переменную AllowNewOrders (если ее нет)
2) создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа
3) пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders
4) при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий
[отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]
5) если пункт 4 не выполняется, значит можно открывать новые ордера.
Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...
Ниже напишу, как я страхуюсь на этот случай...
Если грамотно решение ошибок предусмотреть, то процент успешности открытия ордера возрастает.
Как может изменится код внизу при таких условиях?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;
Код генерации магика поставил при открытии первых ордеров серий, но вот проблема при открытии новых ордеров в этих же сериях.
Сам код генерации магика из поста://+------------------------------------------------------------------+
// keekkenen: получаем следующий магик в серии
int getNextMagicNumber(){
int magic = EMPTY;
if (OrdersTotal() == 0) {
return(startMagicNumber);
}
for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}
if (magic == EMPTY){
magic = startMagicNumber; // первый в серии
} else {
magic++; //следующий в серии
}
return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: проверяем наличие ордера в рынке с заданным магиком
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
извиняюсь если спутал ветки, но куда приткнуть правильно ТЕМУ не нашел, так что не пинайте.
Некоторое время назад просматривая в интернете существующие новинки советников от пользователей, повстречался мне один на который я не обратил внимание, так как по описанию был стандартным, коих привеликое множество, на свою беду не обратил внимание и на название тоже.
Может кто пользуется, кто видел или читал, подскажите хотя бы название, а гугл свое дело сделает или если имеется приму в дар. Может есть схожий советник выполняющий аналогичные действия.
Опишу смысл советника (замудреного нет ничего, чем сейчас мне и необходим).
Если грубо говоря то тех задание выглядело бы так:
1. Открыли позицию в ручную, например buy.
2. Советник выставил ему стоплосс и тейкпрофит по настройкам.
3. Ордер закрылся по тейкпрофиту - советник сразу открывается еще один buy и выставляет ему те же стоплосс и тейкпрофит, до тех пор пока не поймает первый стоплосс либо если есть конечный тейкпрофит.
4. Если позиция закрылась по стоплоссу то робот больше ничего не предпринимает. Советник ждет открытия следующего ордера в ручную.
Все.
Буду примного благодарен.
Вставил неправильно, но он всё равно не сработал бы как надо, потому что... Потому что.)) Короче, надо вот так:
1) в ините создаем переменную AllowNewOrders (если ее нет)
2) создаем новый ордер, пока он не закроется OnTick этого символа простаивает, но будет работать OnTick другого символа
3) пункт 2 для других символов выполняем, пока не достигнем предела MaxOpenOrders
4) при завершении ордера, если он убыточный или нулевой, запрещаем через AllowNewOrders открытие новых ордеров для всех копий
[отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?]
5) если пункт 4 не выполняется, значит можно открывать новые ордера.
Программа ДОЛЖНА УЖЕ работать при MaxOpenOrders=1. Возможно еще возникнет проблема, когда вслед за убыточным ордером запрещаем новые ордера AllowNewOrders=0, а следующий OrderSend по каким-то причинам ордер не откроет. Ниже напишу, как я страхуюсь на этот случай...
Спасибо Александр, завтра проверю. [отсюда сразу проблема- когда убыточная серия завершается, AllowNewOrders=1, а если MaxOpenOrders>1 и этих сессий несколько?] Если MaxOpenOrders>1 на какое то значение, то по идее AllowNewOrders=1 тоже должен быть больше на это же значение. Но с этим можно пока не заморачиваться и MaxOpenOrders убрать вообще, так как в этом варианте программы все равно не планируется больше одной серии.
Привет всем !
Вот есть такой графический объект на графике.
В его параметрах время, значение , код. Значение соответствует цене, на уровне которой находится объект.
Можно как-то получить его время и значение ( через функцию или еще как) ?
\\\\\
Шире вопрос можно поставить так : есть ли объекты ( кроме трендовых линий, линий фибонначи, ганна ), у которых можно получить сразу время и цену ?
Мне нужно ставить на график какие-то метки и получать из них информацию. Рисовать тренд. линии , фибо и др.. - ужасно громоздко и медленно...
Спасибо за ответы !
PS Только начал изучение...
Привет всем !
Вот есть такой графический объект на графике.
В его параметрах время, значение , код. Значение соответствует цене, на уровне которой находится объект.
Можно как-то получить его время и значение ( через функцию или еще как) ?
\\\\\
Шире вопрос можно поставить так : есть ли объекты ( кроме трендовых линий, линий фибонначи, ганна ), у которых можно получить сразу время и цену ?
Мне нужно ставить на график какие-то метки и получать из них информацию. Рисовать тренд. линии , фибо и др.. - ужасно громоздко и медленно...
Спасибо за ответы !
PS Только начал изучение...
https://docs.mql4.com/ru/objects/objectgetinteger
Попробовал, первые пять минут работал нормально, потом стал открывать одновременно несколько сделок (4) причем по одной и той же паре с увеличенным лотом. Александр, мне не совсем понятно в твоём варианте каким образом глобальная переменная получает и изменяет своё значение?
Так ты начни последовательно. Сначала тест на одной паре все возможные варианты сделок, потом только на нескольких запускай. (4) - это количество сделок?