[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 29

 

Здравствуйте...

Написал советника, но столкнулся с такой проблемой:

У меня есть противоположные ордера и например для 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;}}}} 
 
Ребята у кого есть скрипт растягивающий график на все выходные дни, тоесть, чтоб график не слипался с наступлением понедельника, а так и остовались пустые дни Суббота и Воскресенье .
 

Всем привет.

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

 
dmitriy086:

Всем привет.

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


запомните время 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], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?
 
dmitriy086:
IgorM, проблема в том, что эта ф-ия на синтетическом графике, где iTime[0] может быть равно iTime[1], вот как бы обойтись без времени, чтоб советник на новом баре открывал только одну сделку?


если время баров 0 и 1 по некой непонятной причине для меня нельзя привести в соответствие - тип datetime хранит данные в секундах, измените хоть на 1сек время бара

тогда попробуйте запоминать все характеристики первого закрытого бара, т.е. OHLC, обьем и время открытия, если изменится хоть один параметр - значит новый бар

ЗЫ: ф-ция iBars() выдаст количество баров на текущем ТФ, и будет ограниченно настройками терминала, можно попробовать сравнивать количество баров с запомненным кол-вом баров, и в момент появления нового бара эти величины различны- но не всегда, у меня работало так, но наверно от номера билда МТ4 такой вариант может не пройти

 
а у Вас готового кусочка кода нету, случайно? а там сам не соображу как запомнить OHLC[1], и сравнить с OHLC[0]...
 
dmitriy086:
а у Вас готового кусочка кода нету, случайно? а там сам не соображу как запомнить OHLC[1], и сравнить с OHLC[0]...


OHLC это общепринятое сокращение Open,High,Low,Close

сравните не с нулевым, а первый с запомненным ранее, т.е.

init(){

oldHigh = High[1];

///

}

start(){

double tmp = High[1];

if(tmp !=oldHigh) {oldHigh = tmp;

//проверяем остальные параметры бара

}

}

 

Спасибо за подсказку буду разбираться...

 

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

Вот код (как я думаю, отвечающий за открытие поз):

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (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. Я не программист. Если можно поподробнее объясните чайнику.

Причина обращения: