Experts: Arbitrage triangulaire

 

Arbitrage triangulaire:

Cet Expert Advisor (EA) met en œuvre une stratégie d'arbitrage triangulaire entre trois paires de devises : EURUSD, USDJPY et EURJPY.

Author: Джованни Орсани

 
Bonjour, je voudrais savoir dans quel simulateur se trouve l'EA pour qu'il fonctionne, ou dans les trois simulateurs que j'ai mentionnés.
 
Edward Garnica placé pour fonctionner ou faut-il le placer dans les trois symboles que vous mentionnez.
N'importe quel symbole peut être utilisé, même un symbole autre que les trois mentionnés, car ils sont tous définis dans le code.
 
Fonctionne bien sur les données historiques (objectif de profit fixé à 0,1$). J'ai réglé le délai (ping) au niveau de 60 ms.

Je l'ai également essayé sur des données réelles sur un compte de démonstration :
Il ouvre et ferme des transactions, mais à un désavantage. Probablement à cause du long temps de ping (j'ai eu environ 60 ms).
Je veux essayer via VPS.
 
sfhomebiz #:
Fonctionne bien sur les données historiques(objectif de profit fixé à 0,1$). J'ai fixé le délai (ping) à 60 ms.
La raison est la suivante.
void CloseArbitragePositions()
{
   double totalProfit = 0;
  
   // Calculer le bénéfice cumulé des positions avec le Magic Number
   for(int i = 0; i < PositionsTotal(); i++)
   {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket))
      {
         if(PositionGetInteger(POSITION_MAGIC) == MagicNumber)
            totalProfit += PositionGetDouble(POSITION_PROFIT);
      }
   }
  
   if(totalProfit >= ProfitTarget)
   {
      Print("Profit target raggiunto: ", totalProfit, ". Procedo alla chiusura delle posizioni.");
      
      // Modifie les positions en procédant par itération à l'intérieur pour plus de sécurité
      for(int i = PositionsTotal() - 1; i >= 0; i--)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionSelectByTicket(ticket))
         {
            if(PositionGetInteger(POSITION_MAGIC) == MagicNumber)
            {
               string sym = PositionGetString(POSITION_SYMBOL);
               if(!trade.PositionClose(sym))
                  Print("Errore nella chiusura della posizione su ", sym, " - ", GetLastError());
               else
                  Print("Posizione su ", sym, " chiusa con successo.");
            }
         }
      }
   }
}
Tous les EAs avec cette condition montreront quelque chose de bon.
 
fxsaber #:
La raison en est la suivante. Tous les EAs avec cette condition montreront quelque chose de bon.
Il n'imprime donc pas les résultats négatifs ?
 
xery #:
Il n'affiche donc pas les résultats négatifs ?

Seulement lorsque la passe du testeur est arrêtée.

 
// C'est plus puissant, plus utilisable int CheckArbitrageOpportunity(double &diff, double &impliedPrice, double &directPrice) { double price1 = SymbolInfoDouble(symbol1, SYMBOL_BID) ; double price2 = SymbolInfoDouble(symbol2, SYMBOL_BID) ; directPrice = SymbolInfoDouble(symbol3, SYMBOL_ASK) ; impliedPrice = price1 * price2 ; diff = (prix implicite - prix direct) / prix direct ; if(diff > Threshold) return 1 ; price1 = SymbolInfoDouble(symbol1, SYMBOL_ASK) ; price2 = SymbolInfoDouble(symbol2, SYMBOL_ASK) ; directPrice = SymbolInfoDouble(symbol3, SYMBOL_BID) ; impliedPrice = price1 * price2 ; diff = (impliedPrice - directPrice) / directPrice ; if(diff < -Threshold) return -1 ; return 0 ; }
 
michal_ SYMBOL_BID) ; double price2 = SymbolInfoDouble(symbol2, SYMBOL_BID) ; directPrice = SymbolInfoDouble(symbol3, SYMBOL_ASK) ; impliedPrice = price1 * price2 ; diff = (prix implicite - prix direct) / prix direct ; if(diff > Threshold) return 1 ; price1 = SymbolInfoDouble(symbol1, SYMBOL_ASK) ; price2 = SymbolInfoDouble(symbol2, SYMBOL_ASK) ; directPrice = SymbolInfoDouble(symbol3, SYMBOL_BID) ; impliedPrice = price1 * price2 ; diff = (impliedPrice - directPrice) / directPrice ; if(diff < -Threshold) return -1 ; return 0 ; }
Pourquoi avez-vous décidé d'utiliser le bid des deux premiers symboles pour calculer le ask du directprice et vice-versa ?