У меня есть противоположные ордера и например для BUY у меня стоп 150 пунктов и профит также 150, для SELL установлены те же уровни, но только перевёрнуты(т.е. то что для бай профит, то для селл стоп), т.е. фактически у меня всё должно закрываться одновременно, как селл с бай, так и бай с селл.....но тут фича в другом, спрэд!))) И от этих двух противоположных ордеров уже открываются остальные 8 (если конечно все восемь понадобятся, условия для них разные, они так же противоположные 4/4)
Как грамотно запрограммировать код, что бы закрывалось всё по достижению одной цены одновременно? Ибо в тестере, когда я тестирую, цена порой доходит до нужного уровня, например селл закрывается(не до ходя до установленного уровня, полагаю что это спрэд), а бай висит и по истечению небольшого времени падает и бай закрывается уже по стопу, таким образом мне не удаётся посмотреть правильный результат.
Я буду благодарен, если вы выразите свою мысль программно, т.е. код.
Что бы разобраться более детально даю часть когда, где открываются мои два противоположных(первых) ордера.
if (by == FALSE)
{ g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits),
NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
if (g_ticket_112 > 0) by = TRUE;
}
if (se == false)
{for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--)
{if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES))
{if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
if (se == false)
{g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1,
OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
if (g_ticket_113 > 0) se = TRUE;}}}}
Ребята у кого есть скрипт растягивающий график на все выходные дни, тоесть, чтоб график не слипался с наступлением понедельника, а так и остовались пустые дни Суббота и Воскресенье .
Вопрос такой у кого может быть есть функция определяющая факт открытия нового бара(не важно на каком таймфрейме), а если точнее, то можно разных вариантов(принцепов) нахождения нового бара.
Вопрос такой у кого может быть есть функция определяющая факт открытия нового бара(не важно на каком таймфрейме), а если точнее, то можно разных вариантов(принцепов) нахождения нового бара.
запомните время oldtime = Time[0] и запомненное время сравнивайте if( oldtime !=Time[0])Print("Ура новый бар!!!");
IgorM, проблема в том, что эта ф-ия на синтетическом графике, где iTime[0] может быть равно iTime[1], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?
dmitriy086: IgorM, проблема в том, что эта ф-ия на синтетическом графике, где iTime[0] может быть равно iTime[1], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?
если время баров 0 и 1 по некой непонятной причине для меня нельзя привести в соответствие - тип datetime хранит данные в секундах, измените хоть на 1сек время бара
тогда попробуйте запоминать все характеристики первого закрытого бара, т.е. OHLC, обьем и время открытия, если изменится хоть один параметр - значит новый бар
ЗЫ: ф-ция iBars() выдаст количество баров на текущем ТФ, и будет ограниченно настройками терминала, можно попробовать сравнивать количество баров с запомненным кол-вом баров, и в момент появления нового бара эти величины различны- но не всегда, у меня работало так, но наверно от номера билда МТ4 такой вариант может не пройти
Подскажите как в условии открытия позиции правильно задать проверку на то - существует ли открытая поза по данному инструменту или нет. И если поза по инструменту есть(любая селл или бай), то открытие не происходит в противном случае сигнал на открытие отрабатывается?
Вот код (как я думаю, отвечающий за открытие поз):
if (NumberOfPositions("" ,-1,Magic)>=2) флаг1=1;//если число позиций >= 2if (NumberOfPositions("" ,-1,Magic)<1 ) флаг1=0;//если нет откр. позицийif ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным //продаем 1-й символ и покупаем второй символ//----------------------------------------if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символуif (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
{
SL=0;TP=0;//открываем позицию, задаем стопы :if(StopLoss_1>0) SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1;
ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
}}//если нет поз.селл и поз.бай по 1-му символу//--------------------------------------if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
{
SL=0;TP=0;//открываем позицию, задаем стопы :if(StopLoss_2>0) SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
}}//если нет поз. бай и поз. селл по 2-му символу
Вроде по логике правильно, но не работает все равно открывает по несколько поз по одному инструменту.
P.S. Я не программист. Если можно поподробнее объясните чайнику.
Здравствуйте...
Написал советника, но столкнулся с такой проблемой:
У меня есть противоположные ордера и например для BUY у меня стоп 150 пунктов и профит также 150, для SELL установлены те же уровни, но только перевёрнуты(т.е. то что для бай профит, то для селл стоп), т.е. фактически у меня всё должно закрываться одновременно, как селл с бай, так и бай с селл.....но тут фича в другом, спрэд!))) И от этих двух противоположных ордеров уже открываются остальные 8 (если конечно все восемь понадобятся, условия для них разные, они так же противоположные 4/4)
Как грамотно запрограммировать код, что бы закрывалось всё по достижению одной цены одновременно? Ибо в тестере, когда я тестирую, цена порой доходит до нужного уровня, например селл закрывается(не до ходя до установленного уровня, полагаю что это спрэд), а бай висит и по истечению небольшого времени падает и бай закрывается уже по стопу, таким образом мне не удаётся посмотреть правильный результат.
Я буду благодарен, если вы выразите свою мысль программно, т.е. код.
Что бы разобраться более детально даю часть когда, где открываются мои два противоположных(первых) ордера.
Всем привет.
Вопрос такой у кого может быть есть функция определяющая факт открытия нового бара(не важно на каком таймфрейме), а если точнее, то можно разных вариантов(принцепов) нахождения нового бара.
Всем привет.
Вопрос такой у кого может быть есть функция определяющая факт открытия нового бара(не важно на каком таймфрейме), а если точнее, то можно разных вариантов(принцепов) нахождения нового бара.
запомните время oldtime = Time[0] и запомненное время сравнивайте if( oldtime !=Time[0])Print("Ура новый бар!!!");
ЗЫ:прицепы находятся в ф-ции iTime()
:)
//+------------------------------------------------------------------+ bool fNewBar() { static datetime NewTime=0; if(NewTime!=iTime (Symbol(),0,0)) { if(NewTime==0) { NewTime=iTime (Symbol(),0,1);return(false); } NewTime=iTime (Symbol(),0,0); return(true); } return(false); } //+----------------------------------------------------------------------------+IgorM, проблема в том, что эта ф-ия на синтетическом графике, где iTime[0] может быть равно iTime[1], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?IgorM, проблема в том, что эта ф-ия на синтетическом графике, где iTime[0] может быть равно iTime[1], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?
если время баров 0 и 1 по некой непонятной причине для меня нельзя привести в соответствие - тип datetime хранит данные в секундах, измените хоть на 1сек время бара
тогда попробуйте запоминать все характеристики первого закрытого бара, т.е. OHLC, обьем и время открытия, если изменится хоть один параметр - значит новый бар
ЗЫ: ф-ция iBars() выдаст количество баров на текущем ТФ, и будет ограниченно настройками терминала, можно попробовать сравнивать количество баров с запомненным кол-вом баров, и в момент появления нового бара эти величины различны- но не всегда, у меня работало так, но наверно от номера билда МТ4 такой вариант может не пройти
а у Вас готового кусочка кода нету, случайно? а там сам не соображу как запомнить OHLC[1], и сравнить с OHLC[0]...
OHLC это общепринятое сокращение Open,High,Low,Close
сравните не с нулевым, а первый с запомненным ранее, т.е.
init(){
oldHigh = High[1];
///
}
start(){
double tmp = High[1];
if(tmp !=oldHigh) {oldHigh = tmp;
//проверяем остальные параметры бара
}
}
Спасибо за подсказку буду разбираться...
Подскажите как в условии открытия позиции правильно задать проверку на то - существует ли открытая поза по данному инструменту или нет. И если поза по инструменту есть(любая селл или бай), то открытие не происходит в противном случае сигнал на открытие отрабатывается?
Вот код (как я думаю, отвечающий за открытие поз):
Вроде по логике правильно, но не работает все равно открывает по несколько поз по одному инструменту.
P.S. Я не программист. Если можно поподробнее объясните чайнику.