Советники: Треугольный арбитраж

 

Треугольный арбитраж:

Данный советник реализует треугольную арбитражную стратегию между тремя валютными парами: EURUSD, USDJPY и 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 размещается советник для работы или необходимо размещать его на трех символах, которые вы упомянули.
Можно использовать любой символ, даже отличный от трех указанных, так как все они определены в коде.
 
Отлично работает на исторических данных (целевой профит установил на 0,1$). Устанавливал задержку (пинг) на уровне 60 мс.

Также пробовал на реальных данных на демо-счёте:
Открывает и закрывает сделки, но в минус. Возможно, из-за большого времени пинга (у меня был около 60 мс).
Хочу попробовать через VPS.
 
sfhomebiz #:
Отлично работает на исторических данных (целевой профит установил на 0,1$). Устанавливал задержку (пинг) на уровне 60 мс.
Причина в этом.
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.");
            }
         }
      }
   }
}
Все советники с таким условием будут показывать нечто хорошее.
 
fxsaber #:
Причина в следующем. Все советники с этим условием покажут что-то хорошее.
Значит, он не выводит результаты, которые были отрицательными?
 
xery #:
Значит, он не выводит результаты, которые были отрицательными?

Только на момент остановки прохода Тестера.

 
// Это более мощный, более высокий порог использования 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; }
Почему вы решили использовать бид первых двух символов для расчета аск директпрайса и наоборот...?