Question sur le conseiller multi-devises - page 13

 

Bonjour !

Veuillez me conseiller. C'est ainsi que les positions sont ouvertes pour chaque paire dans l'EA multi-devises.

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

Veuillez me conseiller. Comment puis-je écrire une fonction séparée au lieu de ce bloc.

Je ne dois donc pas réécrire ce bloc pour chaque paire ?

(Le bloc utilise le fi de I.Kim et le fi d'ouverture de Market Watch).

 
Rita писал(а) >>

Bonjour !

Veuillez me conseiller. C'est ainsi que les positions sont ouvertes pour chaque paire dans l'EA multi-devises.

Veuillez me conseiller. Comment puis-je écrire une fonction séparée au lieu de ce bloc.

Je ne dois donc pas réécrire ce bloc pour chaque paire ?

(J'ai utilisé le fi de I.Kim et le fi d'ouverture de Market Watch dans les conditions d'exécution des ordres de marché).

void FUN(string _Symbol){

// Votre code, mais en utilisant _Symbol au lieu d'un symbole

}

 

Merci. Qu'en est-il des offres, des demandes, des deltas, des lots et du bool TRADE (c'est la permission d'entrée) pour chaque paire ?

Est-ce que cela serait correct ? -

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

Aussi. Il me semble avoir entendu dire en passant qu'il est incorrect d'utiliser (appeler) une fonction personnalisée à l'intérieur d'une autre.

Et j'utilise une fonction dans un bloc pour ouvrir des positions en exécution d' ordre de marché 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);}
N'y aura-t-il pas des problèmes et des dysfonctionnements ?
 
Rita писал(а) >>

Merci. Qu'en est-il des offres, des demandes, des deltas, des lots et du bool TRADE (c'est la permission d'entrée) pour chaque paire ?

Est-ce que cela serait correct ? -

Aussi. Il me semble avoir entendu dire en passant qu'il est incorrect d'utiliser (appeler) une fonction personnalisée à l'intérieur d'une autre.

Et j'utilise dans mon bloc la fonction d'ouverture de positions en conditions d'exécution des ordres de marché Market Watch

N'y aura-t-il pas des problèmes et des dysfonctionnements ?

double _Bid=MarketInfo(_Symbol, MODE_BID) ;

double _Ask=MarketInfo(_Symbol, MODE_ASK) ;

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

La fonction d'appel peut se situer à n'importe quel endroit. Il n'y aura aucun problème.

 
Ok. Merci.
 

Bonjour !

J'utilise un chalut dans un camion multi-devises. C'est comme ça :

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

Afin d'engager le chalutage de toutes les paires de multidevises, je l'ai remanié comme suit.

(Les points d'enchère sont appelés par 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);
        }   }   } 
//--------------------------------------------------------------
   }   }  }

Le Conseiller Expert fonctionne par les prix d'ouverture.

Le chalut s'appelle comme ça :

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

Cependant. Le chalut ne fonctionne pas avec ce réglage.

Si je retire le chalut d'un symbole, le chalut d'une autre paire commence à fonctionner.

Si les deux appels de paires de pistes sont présents dans le code, aucun d'entre eux ne fonctionne.

Veuillez me conseiller. Où peut-il y avoir une erreur ?

 

Vous devez utiliser un prevtime différent pour chaque instrument et cadre temporel.

 

Merci Vinin !

J'étais justement sur le point d'écrire mon propre chalut pour chaque paire.....

 

Aide avec le conseiller multi-devises.

J'ai écrit un EA. Il ouvre/ferme simultanément des ordres pour deux paires EURUSD <-> GBPUSD. Je le lie à l'EURUSD. Lire les cotations pour les deux paires (iOpen). Les commandes ci-dessous sont exécutées

Ask_EUR = MarketInfo("EURUSD", MODE_ASK) ;

Bid_EUR = MarketInfo("EURUSD", MODE_BID) ;

Et ces commandes ne sont pas exécutées

Ask_GBP = MarketInfo("GBPUSD", MODE_ASK) ;

Bid_GBP = MarketInfo("GBPUSD", MODE_BID) ;

Valeurs ask = bid = 0

Pouvez-vous me dire ce qui se passe ?

 
Une deuxième paire est-elle présente dans la fenêtre MARKET OVERVIEW ?