Sistemi Esperti: Triangular Arbitrage

 

Triangular Arbitrage:

Questo Expert Advisor (EA) implementa una strategia di arbitraggio triangolare tra tre coppie di valute: EURUSD, USDJPY ed EURJPY

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

 
hola qusiera saber en que simbolo se coloca el EA para que trabaje o toca colocarlo en los tres simbolos que mencionas
 
Edward Garnica posizionato l'EA per funzionare o è necessario posizionarlo nei tre simboli che menzionate.
Si può usare qualsiasi simbolo, anche un simbolo diverso dai tre citati, in quanto sono tutti definiti nel codice.
 
Funziona bene sui dati storici (obiettivo di profitto fissato a 0,1$). Ho impostato il ritardo (ping) al livello di 60 ms.

L'ho provato anche su dati reali su un conto demo:
Apre e chiude i trade, ma con uno svantaggio. Probabilmente a causa del lungo tempo di ping (avevo circa 60 ms).
Voglio provare via VPS.
 
sfhomebiz #:
Funziona bene sui dati storici(obiettivo di profitto impostato a 0,1$). Ho impostato il ritardo (ping) a 60 ms.
Il motivo è questo.
void CloseArbitragePositions()
{
   double totalProfit = 0;
  
   // Calcola il profitto cumulativo delle posizioni col 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.");
      
      // Chiude le posizioni iterando all'indietro per sicurezza
      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.");
            }
         }
      }
   }
}
Tutti gli EA con questa condizione mostreranno qualcosa di buono.
 
fxsaber #:
Il motivo è questo. Tutti gli EA con questa condizione mostreranno qualcosa di buono.
Quindi non stampa i risultati negativi?
 
xery #:
Quindi non visualizza i risultati negativi?

Solo quando il passaggio del Tester viene interrotto.

 
// Questo è più potente, più alto trashold utilizzabile 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 = (impliedPrice - directPrice) / directPrice; 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 = (impliedPrice - directPrice) / directPrice; 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; }
Perché avete deciso di utilizzare il bid dei primi due simboli per calcolare l'ask del directPrice e viceversa?