[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 10

 
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 - в валюте залоговых средств.
MODE_PROFITCALCMODE 27 Способ расчета прибыли. 0 - Forex; 1 - CFD; 2 - Futures
MODE_MARGINCALCMODE 28 Способ расчета залоговых средств. 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 Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.

 
SeALALex:

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


там в хелпе почти готовый пример готовый пример

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;
       }
надо запомнить время закрытия ордера 
сравнить время закрытия ордера с временем закрытия в предыдущей итерации
если (время закрытия больше и тип торговой операции бай или селл)
то запомнить время текущего ордера и тип торговой операции  
// в результате по окончании цикла знаем тип ордера который закрылся последним 
    }
Как то так  .

 
ivandurak:


Предварительно проверьте уровни установки стопов и профитов .


В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:

3.3. Если позиция открывается через клиентский терминал с использованием советника, Клиент не может обозначить уровни Stop Loss и/или Take Profit Orders. Если Клиент желает разместить эти ордера, он может сделать это, модифицировав существующую позицию в соответствии с пунктами 5.16 - 5.22 и 9.13 - 9.16.

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


В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:

Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.

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


В этом списке нет проверки для определённых типов счетов. Вот пункт из Регламента Торговых Операций для счетов NDD:

Меня интересует можно ли это проверить программно. Как я понял, нет. В программу нужно изначально писать функцию открытия позиций/установки отложенных ордеров с учётом тех условий, которые установил брокер.

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

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

))) Нет. Вы меня совсем не поняли. Я писал не про "программно установить", а про программно определить. На некоторых типах счетов нельзя сразу открывать позицию и устанавливать стопы/тейки, что для меня было бы предпочтительней/безопасней. На mql5, если не ошибаюсь вроде бы можно это определять. Хотелось бы иметь возможность определять этот момент и в зависимости от определения выбирать, какую функцию использовать.
 
Roman.:

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

Да, проблемы нет, когда есть решение. Нужно просто пользоваться тем, что есть и пользоваться при этом правильно.))
 

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

 
SeALALex:

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

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
Roman. Не получается, что не так?
Причина обращения: