tol64: Подскажите, можно ли программно определить возможность установки стоп-лосса/тейк-профита сразу при открытии позиции/установки отложенного ордера либо после?
Предварительно проверьте уровни установки стопов и профитов .
Идентификаторы запроса, используемые в функции MarketInfo(). Mогут быть одной из следующего величин:
Константа
Значение
Описание
MODE_LOW
1
Минимальная дневная цена
MODE_HIGH
2
Максимальная дневная цена
MODE_TIME
5
Время поступления последней котировки
MODE_BID
9
Последняя поступившая цена предложения. Для текущего инструмента хранится в предопределенной переменной Bid
MODE_ASK
10
Последняя поступившая цена продажи. Для текущего инструмента хранится в предопределенной переменной Ask
MODE_POINT
11
Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point
MODE_DIGITS
12
Количество цифр после десятичного точки в цене инструмента. Для текущего инструмента хранится в предопределенной переменной Digits
MODE_SPREAD
13
Спрэд в пунктах
MODE_STOPLEVEL
14
Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
MODE_LOTSIZE
15
Размер контракта в базовой валюте инструмента
MODE_TICKVALUE
16
Размер минимального изменения цены инструмента в валюте депозита
MODE_TICKSIZE
17
Минимальный шаг изменения цены инструмента в валюте котировки
MODE_SWAPLONG
18
Размер свопа для длинных позиций
MODE_SWAPSHORT
19
Размер свопа для коротких позиций
MODE_STARTING
20
Календарная дата начала торгов (обычно используется для фьючерсов)
MODE_EXPIRATION
21
Календарная дата конца торгов (обычно используется для фьючерсов)
MODE_TRADEALLOWED
22
Разрешение торгов по указанному инструменту
MODE_MINLOT
23
Минимальный размер лота
MODE_LOTSTEP
24
Шаг изменения размера лота
MODE_MAXLOT
25
Максимальный размер лота
MODE_SWAPTYPE
26
Метод вычисления свопов. 0 - в пунктах; 1 - в базовой валюте инструмента; 2 - в процентах; 3 - в валюте залоговых средств.
Способ расчета залоговых средств. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы
MODE_MARGININIT
29
Начальные залоговые требования для 1 лота
MODE_MARGINMAINTENANCE
30
Размер залоговых средств для поддержки открытых позиций в расчете на 1 лот
MODE_MARGINHEDGED
31
Маржа, взимаемая с перекрытых позиций в расчете на 1 лот
MODE_MARGINREQUIRED
32
Размер свободных средств, необходимых для открытия 1 лота на покупку
MODE_FREEZELEVEL
33
Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.
Всем здрасти! только учусь написанию советников, как и многие первые советники на обычных стандартных идикаторах, написать написал вот только, теперь усложнил себе задачу, но не знаю как будет выглядеть код. Вообщем как сделать, чтобы при возникновении условий открывалась позиция и при ее закрытии допустим по тейку при сохраннении техже условий, новая не открывалась, а открывалась, только при возникновении противоположных условий и т.д. Спасибо!!!
там в хелпе почти готовый пример готовый пример
int i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
надо запомнить время закрытия ордера
сравнить время закрытия ордера с временем закрытия в предыдущей итерации
если (время закрытия больше и тип торговой операции бай или селл)
то запомнить время текущего ордера и тип торговой операции
// в результате по окончании цикла знаем тип ордера который закрылся последним
}
Как то так .
Предварительно проверьте уровни установки стопов и профитов .
В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
3.3. Если позиция открывается через клиентский терминал с использованием советника, Клиент не может обозначить уровни Stop Loss и/или Take Profit Orders. Если Клиент желает разместить эти ордера, он может сделать это, модифицировав существующую позицию в соответствии с пунктами 5.16 - 5.22 и 9.13 - 9.16.
Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.
В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.
Как то не совсем понятны правила установки ордеров, попробуйте поиграть на демо, что можно а что нет . На сколько я понял ничто не мешает програмно установить ордер, а затем его модифицировать .Право как то странно, если только не отрубать вам связь после открытия позиции оставив без стопа .
В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.
Проблемы нет никакой. Даже (если не в личное пользование, ибо сам то знаешь на каких счетах (торговых условиях и у кого) его пользовать), но если советника далаешь на заказ и клиент сам еще не определился на каких счетах и где будет его использовать, даже на типах счетов с возможностью установки сразу тейка и стопа, то все равно по умолчанию изготавливаете советника с нулевыми значениями этих уровней при установке всех типов ордеров, далее уже с их модификацией (будет работать и там и там), при этом, естественно никто не отменял проведение проверки требований и ограничений при проведении торговых операций при любых вариантах установки и последующей модификации всех типов ордеров и уровней стопов и тейков в той или иной конторе.
Как то не совсем понятны правила установки ордеров, попробуйте поиграть на демо, что можно а что нет . На сколько я понял ничто не мешает програмно установить ордер, а затем его модифицировать .Право как то странно, если только не отрубать вам связь после открытия позиции оставив без стопа .
))) Нет. Вы меня совсем не поняли. Я писал не про "программно установить", а про программно определить. На некоторых типах счетов нельзя сразуоткрывать позицию и устанавливать стопы/тейки, что для меня было бы предпочтительней/безопасней. На mql5, если не ошибаюсь вроде бы можно это определять. Хотелось бы иметь возможность определять этот момент и в зависимости от определения выбирать, какую функцию использовать.
Проблемы нет никакой. Даже (если не в личное пользование, ибо сам то знаешь на каких счетах (торговых условиях и у кого) его пользовать), но если советника далаешь на заказ и клиент сам еще не определился на каких счетах и где будет его использовать, даже на типах счетов с возможностью установки сразу тейка и стопа, то все равно по умолчанию изготавливаете советника с нулевыми значениями этих уровней при установке всех типов ордеров, далее уже с их модификацией (будет работать и там и там), при этом, естественно никто не отменял проведение проверки требований и ограничений при проведении торговых операций при любых вариантах установки и последующей модификации всех типов ордеров и уровней стопов и тейков в той или иной конторе.
Да, проблемы нет, когда есть решение. Нужно просто пользоваться тем, что есть и пользоваться при этом правильно.))
Roman. и ivandurak СПАСИБО огромное что ответили, но для меня это пока тяжко разобрать, я нашел еще на одном форуме предложение как это сделать, вот только пока применить не могу к своему обычному коду
int BuyTrue, SellTrue;// определяем переменные которые будут служить нам вышеуказанными флагами .... //--- Условие для Buy if (BuyTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы { .... OrderSend(....); //функция для открытия ордера BuyTrue=1; // При BuyTrue=1 условие для открытия позы не будет полностью удовлетворяться // следовательно при повторном сигнале на бай сделка открываться не будет SellTrue=0; // При SellTrue=0 условие для открытия позы будет полностью удовлетворяться // следовательно следующеей сделкой будет только Sell .... }
//--- Условие для Sell if (SellTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы { .... OrderSend(....); //функция для открытия ордера SellTrue=1; // При SellTrue=1 условие для открытия позы не будет полностью удовлетворяться // следовательно при повторном сигнале на Sell сделка открываться не будет BuyTrue=0; // При BuyTrue=0 условие для открытия позы будет полностью удовлетворяться // следовательно следующеей сделкой будет только Buy .... }
Мой код открытия сделки
total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point)) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // check for short position (SELL) possibility if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point)) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); }
Roman. и ivandurak СПАСИБО огромное что ответили, но для меня это пока тяжко разобрать, я нашел еще на одном форуме предложение как это сделать, вот только пока применить не могу к своему обычному коду
int BuyTrue, SellTrue;// определяем переменные которые будут служить нам вышеуказанными флагами .... //--- Условие для Buy if (BuyTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы { .... OrderSend(....); //функция для открытия ордера BuyTrue=1; // При BuyTrue=1 условие для открытия позы не будет полностью удовлетворяться // следовательно при повторном сигнале на бай сделка открываться не будет SellTrue=0; // При SellTrue=0 условие для открытия позы будет полностью удовлетворяться // следовательно следующеей сделкой будет только Sell .... }
//--- Условие для Sell if (SellTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы { .... OrderSend(....); //функция для открытия ордера SellTrue=1; // При SellTrue=1 условие для открытия позы не будет полностью удовлетворяться // следовательно при повторном сигнале на Sell сделка открываться не будет BuyTrue=0; // При BuyTrue=0 условие для открытия позы будет полностью удовлетворяться // следовательно следующеей сделкой будет только Buy .... }
Мой код открытия сделки
total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point)) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // check for short position (SELL) possibility if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point)) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); }
Во-первых, вставляйте Ваш код в редакторе через Ctrl+Alt+M (либо сверху в меню нажмите SRC), иначе плохо, чего понятно - все сливается под одно...:-)))
Во-вторых, прочтите учебник, в частности инфу по той ссылочке, что Вам рекомендовал, там ниже кода идет его описание и в самом конце описания как раз расписано - каким образом однократно сообщать о цене выше/ниже МА (у Вас будет аналогия с однократным входом по данному торговому условию-использование флагов и все), прежде, чем ТВОРИТЬ свое ВОЛШЕБСТВО...:-)))
П.С. или в поиске через гугл наберите: Как правильно вставить код site:mql4.com
Подскажите, можно ли программно определить возможность установки стоп-лосса/тейк-профита сразу при открытии позиции/установки отложенного ордера либо после?
Предварительно проверьте уровни установки стопов и профитов .
Идентификаторы запроса, используемые в функции MarketInfo(). Mогут быть одной из следующего величин:
Всем здрасти! только учусь написанию советников, как и многие первые советники на обычных стандартных идикаторах, написать написал вот только, теперь усложнил себе задачу, но не знаю как будет выглядеть код. Вообщем как сделать, чтобы при возникновении условий открывалась позиция и при ее закрытии допустим по тейку при сохраннении техже условий, новая не открывалась, а открывалась, только при возникновении противоположных условий и т.д. Спасибо!!!
там в хелпе почти готовый пример готовый пример
int i,accTotal=OrdersHistoryTotal(); for(i=0;i<accTotal;i++) { //---- check selection result if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Ошибка при доступе к исторической базе (",GetLastError(),")"); break; } надо запомнить время закрытия ордера сравнить время закрытия ордера с временем закрытия в предыдущей итерации если (время закрытия больше и тип торговой операции бай или селл) то запомнить время текущего ордера и тип торговой операции // в результате по окончании цикла знаем тип ордера который закрылся последним } Как то так .Предварительно проверьте уровни установки стопов и профитов .
В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
3.3. Если позиция открывается через клиентский терминал с использованием советника, Клиент не может обозначить уровни Stop Loss и/или Take Profit Orders. Если Клиент желает разместить эти ордера, он может сделать это, модифицировав существующую позицию в соответствии с пунктами 5.16 - 5.22 и 9.13 - 9.16.
Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
Как то не совсем понятны правила установки ордеров, попробуйте поиграть на демо, что можно а что нет . На сколько я понял ничто не мешает програмно установить ордер, а затем его модифицировать .Право как то странно, если только не отрубать вам связь после открытия позиции оставив без стопа .
Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:
Проблемы нет никакой. Даже (если не в личное пользование, ибо сам то знаешь на каких счетах (торговых условиях и у кого) его пользовать), но если советника далаешь на заказ и клиент сам еще не определился на каких счетах и где будет его использовать, даже на типах счетов с возможностью установки сразу тейка и стопа, то все равно по умолчанию изготавливаете советника с нулевыми значениями этих уровней при установке всех типов ордеров, далее уже с их модификацией (будет работать и там и там), при этом, естественно никто не отменял проведение проверки требований и ограничений при проведении торговых операций при любых вариантах установки и последующей модификации всех типов ордеров и уровней стопов и тейков в той или иной конторе.
Как то не совсем понятны правила установки ордеров, попробуйте поиграть на демо, что можно а что нет . На сколько я понял ничто не мешает програмно установить ордер, а затем его модифицировать .Право как то странно, если только не отрубать вам связь после открытия позиции оставив без стопа .
))) Нет. Вы меня совсем не поняли. Я писал не про "программно установить", а про программно определить. На некоторых типах счетов нельзя сразу открывать позицию и устанавливать стопы/тейки, что для меня было бы предпочтительней/безопасней. На mql5, если не ошибаюсь вроде бы можно это определять. Хотелось бы иметь возможность определять этот момент и в зависимости от определения выбирать, какую функцию использовать.
Проблемы нет никакой. Даже (если не в личное пользование, ибо сам то знаешь на каких счетах (торговых условиях и у кого) его пользовать), но если советника далаешь на заказ и клиент сам еще не определился на каких счетах и где будет его использовать, даже на типах счетов с возможностью установки сразу тейка и стопа, то все равно по умолчанию изготавливаете советника с нулевыми значениями этих уровней при установке всех типов ордеров, далее уже с их модификацией (будет работать и там и там), при этом, естественно никто не отменял проведение проверки требований и ограничений при проведении торговых операций при любых вариантах установки и последующей модификации всех типов ордеров и уровней стопов и тейков в той или иной конторе.
Да, проблемы нет, когда есть решение. Нужно просто пользоваться тем, что есть и пользоваться при этом правильно.))
Roman. и ivandurak СПАСИБО огромное что ответили, но для меня это пока тяжко разобрать, я нашел еще на одном форуме предложение как это сделать, вот только пока применить не могу к своему обычному коду
int BuyTrue, SellTrue;// определяем переменные которые будут служить нам вышеуказанными флагами
....
//--- Условие для Buy
if (BuyTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы
{
....
OrderSend(....); //функция для открытия ордера
BuyTrue=1; // При BuyTrue=1 условие для открытия позы не будет полностью удовлетворяться
// следовательно при повторном сигнале на бай сделка открываться не будет
SellTrue=0; // При SellTrue=0 условие для открытия позы будет полностью удовлетворяться
// следовательно следующеей сделкой будет только Sell
....
}
//--- Условие для Sell
if (SellTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы
{
....
OrderSend(....); //функция для открытия ордера
SellTrue=1; // При SellTrue=1 условие для открытия позы не будет полностью удовлетворяться
// следовательно при повторном сигнале на Sell сделка открываться не будет
BuyTrue=0; // При BuyTrue=0 условие для открытия позы будет полностью удовлетворяться
// следовательно следующеей сделкой будет только Buy
....
}
Мой код открытия сделки
total=OrdersTotal();
if(total<1)
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// check for long position (BUY) possibility
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// check for short position (SELL) possibility
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
Roman. и ivandurak СПАСИБО огромное что ответили, но для меня это пока тяжко разобрать, я нашел еще на одном форуме предложение как это сделать, вот только пока применить не могу к своему обычному коду
int BuyTrue, SellTrue;// определяем переменные которые будут служить нам вышеуказанными флагами
....
//--- Условие для Buy
if (BuyTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы
{
....
OrderSend(....); //функция для открытия ордера
BuyTrue=1; // При BuyTrue=1 условие для открытия позы не будет полностью удовлетворяться
// следовательно при повторном сигнале на бай сделка открываться не будет
SellTrue=0; // При SellTrue=0 условие для открытия позы будет полностью удовлетворяться
// следовательно следующеей сделкой будет только Sell
....
}
//--- Условие для Sell
if (SellTrue==0 && ... и плюс другие Ваши условия) // Условие открытия позы
{
....
OrderSend(....); //функция для открытия ордера
SellTrue=1; // При SellTrue=1 условие для открытия позы не будет полностью удовлетворяться
// следовательно при повторном сигнале на Sell сделка открываться не будет
BuyTrue=0; // При BuyTrue=0 условие для открытия позы будет полностью удовлетворяться
// следовательно следующеей сделкой будет только Buy
....
}
Мой код открытия сделки
total=OrdersTotal();
if(total<1)
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// check for long position (BUY) possibility
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// check for short position (SELL) possibility
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
Во-первых, вставляйте Ваш код в редакторе через Ctrl+Alt+M (либо сверху в меню нажмите SRC), иначе плохо, чего понятно - все сливается под одно...:-)))
Во-вторых, прочтите учебник, в частности инфу по той ссылочке, что Вам рекомендовал, там ниже кода идет его описание и в самом конце описания как раз расписано - каким образом однократно сообщать о цене выше/ниже МА (у Вас будет аналогия с однократным входом по данному торговому условию-использование флагов и все), прежде, чем ТВОРИТЬ свое ВОЛШЕБСТВО...:-)))
П.С. или в поиске через гугл наберите: Как правильно вставить код site:mql4.com