Вопрос по мультивалютному советнику - страница 13

 

Доброе утро!

Пож. подскажите. Вот так открываются позиции по каждой паре в муьтивалютном советнике.- 

//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ
//-------------------------Изначальная позиция ----------
if (Trade && pb==0 && (iBarShift("EURCHF_FX",timeFr,OpenTime1)!= 0) 
//если нет открытых дл. позиций и не было на этом баре
   && Bid_<Lbid+Delta*Point_){
if ( iMA("EURCHF_FX",0,period_MA,0,MODE_SMMA,PRICE_MEDIAN,0)< iClose("EURCHF_FX",period_TF,0)
// || !Filter_DT)  { //если фильтр разрешает  
   SL=0;TP=0;
if(StopLoss>0)   SL=Ask_-Point_*StopLoss;
if(TakeProfit>0) TP=Ask_+Point_*TakeProfit;   
ticket=WHCOrderSend("EURCHF_FX",OP_BUY,Lots,Ask_,3,SL,TP,"_001",Magic,0,Blue);
if(ticket < 0) { Print("Ошибка открытия ордера BUY EURCHF_FX  #", GetLastError()); 
               Sleep(10000);   return (0); }
 initorders();               
OpenTime1 = iTime("EURCHF_FX",timeFr,0);
   }}
//жжжжжжжжж Дополнительная позиции жжжжжжжжжжжжжжжжж 
if (NumberOfPositions("EURCHF_FX",OP_BUY, Magic)==1 && 
NumberOfPositions("EURCHF_FX",OP_BUY, Magic_2)<1) {
//если открыта начальная позици
 if (GetProfitOpenPosInPoint("EURCHF_FX",OP_BUY,Magic)<= LEVEL_1
  && iBarShift("EURCHF_FX",timeFr,OpenTime1)!= 0) {
//и если убыток начальн. позиции больше заданного значения
 SL=0;TP=0;
if(StopLoss>0)   SL=Ask_-Point_*StopLoss;
if(TakeProfit>0) TP=Ask_+Point_*TakeProfit;   
ticket=WHCOrderSend("EURCHF_FX",OP_BUY,Lots+dL2,Ask_,50,SL,TP,"002",Magic_2,0,Blue);
if(ticket < 0) { Print("Ошибка открытия ордера BUY EURCHF_FX #", GetLastError()); 
               Sleep(10000);   return (0); }
            
OpenTime1 = iTime("EURCHF_FX",timeFr,0);
   } } 
//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ

Подскажите. Как мне написать отдельную функцию вместо этого блока.

Чтобы не переписывать этот блок для каждой пары ?

(В блоке использованы ф-и И.Кима и ф-я открытия в условиях рыночного исполнения торговых заявок Market Watch).

 
Rita писал(а) >>

Доброе утро!

Пож. подскажите. Вот так открываются позиции по каждой паре в муьтивалютном советнике.-

Подскажите. Как мне написать отдельную функцию вместо этого блока.

Чтобы не переписывать этот блок для каждой пары ?

(В блоке использованы ф-и И.Кима и ф-я открытия в условиях рыночного исполнения торговых заявок Market Watch).

void FUN(string _Symbol){

// Ваш код, но вместо конкретного инструмента используется _Symbol

}

 

Спасибо. А как быть с бидами,  асками, Delta, Lots  и bool TRADE (это разрешение на вход)  для каждой пары?

Вот так будет правильно? -

void FUN(string _Symbol, bool TRADE, double _BID, double _AZK,
         double _Delta,  double _LOTS){

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

А у меня используется в блоке ф-я для открытия позиций в условиях рыночного исполнения торговых заявок Market Watch

int WHCOrderSend(string symbol,   int cmd,   double volume, 
                 double price,int slippage,double stoploss, 
                 double takeprofit,string comment,nt magic, 
                 datetime expiration,   color arrow_color)
{  int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0, comment,
magic, expiration, arrow_color);                              int check = -1;
if (ticket > 0 && (stoploss != 0                      || takeprofit != 0)) {
if(!OrderModify(ticket,price,stoploss,takeprofit,expiration, arrow_color)) {
check = GetLastError();                         if (check != ERR_NO_ERROR) {
Print("OrderModify error: ", ErrorDescription(check)); }   }   }      else {
check = GetLastError();                          if (check != ERR_NO_ERROR){
Print("OrderSend error: ",ErrorDescription(check));   }}   return (ticket);}
Не будут ли проблемы и сбои при работе ?
 
Rita писал(а) >>

Спасибо. А как быть с бидами, асками, Delta, Lots и bool TRADE (это разрешение на вход) для каждой пары?

Вот так будет правильно? -

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

А у меня используется в блоке ф-я для открытия позиций в условиях рыночного исполнения торговых заявок Market Watch

Не будут ли проблемы и сбои при работе ?

double _Bid=MarketInfo(_Symbol, MODE_BID);

double _Ask=MarketInfo(_Symbol, MODE_ASK);

....................................................................

ВЫзов функция может быть в любом месте. Проблем не будет

 
Ок. Благодарю.
 

Добрый день!

Я использую трал в мультивалютнике. Вот такой:

void TrailPositions() // функция трейлинг стоп
{
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
     if (OrderMagicNumber() == Magic ){ 
//--------------------------------------   
     if (OrderType() == OP_BUY )  {
      if (Bid-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point,
                                                     OrderTakeProfit(), 0, Blue);
        }}}
//-----------------------------------------
     if (OrderType() == OP_SELL)  {
      if (OrderOpenPrice()-Ask >MinProfit*Point) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point 
                                                       || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point,
                                                      OrderTakeProfit(), 0, Blue);
        }}} 
//---------------------------------------------  
 }   }  }

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

(Биды-аски-поинт вызываются через MarketInfo(Symbol_1,MODE_ASK);

void TrailPositions(string _Symbol,
                    double _BID,
                    double _AZK,
                    double _Point,
                    int MAGIC,
                    int MinProfit,
                    int TrailingStop,
                    int TrailingStep) 
{  int Orders = OrdersTotal();  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != _Symbol) continue;
     if (OrderMagicNumber() == MAGIC){ 
//----------------------------------------------------   
     if (OrderType() == OP_BUY )  {
      if (_BID-OrderOpenPrice() > MinProfit*_Point) {
        if (OrderStopLoss() < _BID-(TrailingStop+TrailingStep-1)*_Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), _BID-TrailingStop*_Point,
                                                     OrderTakeProfit(), 0, Blue);
        }      }    }
//-------------------------------------------------------
    if (OrderType() == OP_SELL)  {
      if (OrderOpenPrice()- _AZK >MinProfit*_Point) {
        if (OrderStopLoss() > _AZK+(TrailingStop+TrailingStep-1)*_Point 
                                                       || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), _AZK+TrailingStop*_Point,
                                                      OrderTakeProfit(), 0, Blue);
        }   }   } 
//--------------------------------------------------------------
   }   }  }

Советник работает по ценам открытия.

Вызывается трал вот так:

if (UseTrailing_1) {//выключатель трейлинг стопа 1 пары
if(iTime(Symbol_1,TimeFR_1,0)== prevtime) return(0);//ждём появления нового бара
    prevtime = iTime(Symbol_1,TimeFR_1,0);//если появился новый бар , включаемся 
TrailPositions(Symbol_1,Bid1,Ask1,Point1,Magic_1,MinProfit_1,
                                      TrailingStop_1,TrailingStep_1);}
//-------------------------------------------------------------------------------  
 
if (UseTrailing_2){//выключатель трейлинг стопа 2 пары
if(iTime(Symbol_2,TimeFR_2,0)== prevtime) return(0);//ждём появления нового бара
    prevtime = iTime(Symbol_2,TimeFR_2,0);//если появился новый бар , включаемся 
TrailPositions(Symbol_2,Bid2,Ask2,Point2,Magic_2,MinProfit_2,
                                      TrailingStop_2,TrailingStep_2);}

Однако. Трал в таком включении не работает.

Если я убираю трал одного символа совсем, то трал другой пары начинает работать. 

А если присутствуют в коде оба вызова трала - то не работает ни один.

Пож. подскажите. Где может быть ошибка?

 

Надо для каждого инструмента и таймфрейма использовать свой prevtime.

 

Благодарю, Vinin !

а Я  уж было совсем собралась для каждой пары свой трал писать....

 

Помогите с мультивалютником.

Написал советник. Одновременно открывает/закрывает ордера по двум парам EURUSD <-> GBPUSD. Цепляю к EURUSD. Читает котировки обеих пар (iOpen). Команды ниже исполняет

Ask_EUR = MarketInfo("EURUSD", MODE_ASK);

Bid_EUR = MarketInfo("EURUSD", MODE_BID);

А эти команды не исполняет

Ask_GBP = MarketInfo("GBPUSD", MODE_ASK);

Bid_GBP = MarketInfo("GBPUSD", MODE_BID);

Значения ask = bid = 0

Подскажите, в чем дело?

 
А окне ОБЗОР РЫНКА присутствует вторая пара?
Причина обращения: