Asesores Expertos: Arbitraje triangular

 

Arbitraje triangular:

Este Asesor Experto (EA) implementa una estrategia de arbitraje triangular entre tres pares de divisas: EURUSD, USDJPY y EURJPY

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

 
hola qusiera saber en que simbolo se coloca el EA para que trabaje o toca colocarlo en los tres simbolos que mencionas
 
Edward Garnica #hola qusiera saber en que simbolo se coloca el EA para que trabaje o toca colocarlo en los tres simbolos que mencionas
Puede usarse cualquiera, incluso un símbolo diferente a los tres mencionados, ya que todos están definidos en el código.
 
Funciona bien en los datos históricos (objetivo de beneficio fijado en 0,1 $). Establecí el retraso (ping) en el nivel de 60 ms.

También lo probé en datos reales en una cuenta demo:
Abre y cierra operaciones, pero en desventaja. Probablemente debido al largo tiempo de ping (tuve alrededor de 60 ms).
Quiero probar a través de VPS.
 
sfhomebiz #:
Funciona bien con datos históricos(objetivo de beneficio fijado en 0,1 $). He establecido el retraso (ping) a 60 ms.
La razón es la siguiente.
void CloseArbitragePositions()
{
   double totalProfit = 0;
  
   // Calcular el beneficio acumulado de las posiciones con 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.");
      
      // Cambia las posiciones 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.");
            }
         }
      }
   }
}
Todos los EAs con esta condición mostrará algo bueno.
 
fxsaber #:
La razón es la siguiente. Todos los EAs con esta condición mostrarán algo bueno.
Así que no imprime los resultados que fueron negativos?
 
xery #:
¿No muestra los resultados negativos?

Sólo cuando se detiene el paso del Comprobador.

 
// Esto es más potente, mayor trashold utilizable 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; }
¿Por qué ha decidido utilizar la oferta de los dos primeros símbolos para calcular la demanda del precio directo y viceversa?