Pregunta sobre el asesor multidivisa - página 13

 

¡Buenos días!

Por favor, avisa. Así es como se abren las posiciones para cada par en el EA multidivisa.

//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ
//-------------------------Изначальная позиция ----------
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);
   } } 
//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ

Por favor, avisa. ¿Cómo puedo escribir una función independiente en lugar de este bloque?

¿Para no tener que reescribir este bloque para cada par?

(El bloque utiliza la fi de I.Kim y la fi de apertura de Market Watch).

 
Rita писал(а) >>

¡Buenos días!

Por favor, avisa. Así es como se abren las posiciones para cada par en el EA multidivisa.

Por favor, avisa. ¿Cómo puedo escribir una función independiente en lugar de este bloque?

¿Para no tener que reescribir este bloque para cada par?

(He utilizado la fi de I.Kim y la fi de apertura de Market Watch en condiciones de ejecución de órdenes de mercado).

void FUN(string _Symbol){

// Su código, pero utilizando _Symbol en lugar de un símbolo

}

 

Gracias. ¿Qué pasa con las ofertas, las demandas, los Delta, los Lotes y el bool TRADE (este es el permiso de entrada) para cada par?

¿Sería esto correcto? -

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

También. Me parece haber escuchado de pasada que es incorrecto usar (llamar) una función personalizada dentro de otra.

Y estoy utilizando una función en un bloque para abrir posiciones en la ejecución de órdenes de mercado 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);}
¿No habrá problemas y fallos de funcionamiento?
 
Rita писал(а) >>

Gracias. ¿Qué pasa con las ofertas, las demandas, los Delta, los Lotes y el bool TRADE (este es el permiso de entrada) para cada par?

¿Sería esto correcto? -

También. Me parece haber escuchado de pasada que es incorrecto usar (llamar) una función personalizada dentro de otra.

Y utilizo en mi bloque la función de apertura de posiciones en condiciones de ejecución de órdenes de mercado Market Watch

¿No habrá problemas y fallos de funcionamiento?

double _Bid=MarketInfo(_Symbol, MODE_BID);

double _Ask=MarketInfo(_Symbol, MODE_ASK);

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

La función de llamada puede estar en cualquier lugar. No habrá problemas.

 
DE ACUERDO. Gracias.
 

¡Buenas tardes!

Utilizo una red de arrastre en un camión multidivisa. Es así:

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

Para que el arrastre de todos los pares de multidivisas sea posible, lo he rehecho así.

(Los puntos de oferta y demanda se llaman a través de 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);
        }   }   } 
//--------------------------------------------------------------
   }   }  }

El Asesor Experto funciona mediante la apertura de precios.

La red de arrastre se llama así:

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

Sin embargo. La red de arrastre no funciona con esta configuración.

Si quito el arrastre de un símbolo, el arrastre de otro par empieza a funcionar.

Si ambas llamadas de pares de pistas están presentes en el código, ninguna de ellas funciona.

Por favor, avisa. ¿Dónde puede haber un error?

 

Tiene que utilizar un prevtime diferente para cada instrumento y marco temporal.

 

Gracias, Vinin.

Estaba a punto de escribir mi propio arrastre para cada par....

 

Ayuda con el asesor multidivisa.

He escrito un EA. Abre/cierra simultáneamente órdenes para dos pares EURUSD <-> GBPUSD. Lo relaciono con el EURUSD. Lee las cotizaciones de ambos pares (iOpen). Se ejecutan los siguientes comandos

Ask_EUR = MarketInfo("EURUSD", MODE_ASK);

Bid_EUR = MarketInfo("EURUSD", MODE_BID);

Y estos comandos no se ejecutan

Ask_GBP = MarketInfo("GBPUSD", MODE_ASK);

Bid_GBP = MarketInfo("GBPUSD", MODE_BID);

Valores de la oferta = demanda = 0

¿Puede decirme cuál es el problema?

 
¿Hay un segundo par presente en la ventana MARKET OVERVIEW?
Razón de la queja: