AM2
Андрей

 
Уровень 26

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 270



Поарбитражим

Наверняка все слышали о торговле на разнице котировок между быстрым и медленным брокером. Кто не слышал можете посмотреть видео:



Если в двух словах, то когда разница котировок между быстрым и медленным брокером больше порогового значения открывается ордер у медленного брокера в сторону отставания котировок.

Пусть быстрые котировки у нас будут на сайте: www.investing.com/currencies/streaming-forex-rates-majors
Чтобы стибрить спарсить бид из кода страницы, воспользуемся парсером из топика: mql.opentraders.ru/33863.html


   string s=ReadHTML();
   int sf=StringFind(s,SubString);
   string bid=StringSubstr(s,sf+12,6);


Таким незатейливым способом мы получили быстрый бид.

Если цена у быстрого брокера дернулась покупаем или продаем:


   if((double)bid-Bid>Delta*Point)  PutOrder(0,Ask);
   if(Bid-(double)bid>Delta*Point)  PutOrder(1,Bid);


Добавим трал и принудительное закрытие позиции через указанное количество секунд, в случае если профит не достигнут.


//+------------------------------------------------------------------+
//| Простой трал                                                     |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }

   ...

if(TrailingStop>0) Trailing();




//+------------------------------------------------------------------+
//| Время открытия позиции                                           |
//+------------------------------------------------------------------+
datetime TimeOrderOpen()
  {
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }

 ...

   if(TimeCurrent()-TimeOrderOpen()>CloseTime) CloseAll();


Вот мы и набросали простенький арбитражник:


//+------------------------------------------------------------------+
//|                                                       Arbitr.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#import "wininet.dll"
int InternetAttemptConnect(int x);
int InternetOpenW(string sAgent,int lAccessType,string sProxyName="",string sProxyBypass="",int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,string sHeaders="",int lHeadersLength=0,int lFlags=0,int lContext=0);
int InternetReadFile(int hFile,int &sBuffer[],int lNumBytesToRead,int &lNumberOfBytesRead[]);
int InternetCloseHandle(int hInet);
#import

input string URL="http://www.investing.com/currencies/streaming-forex-rates-majors";
input string SubString="pid-1-bid";

//--- Inputs
extern double Lots        = 0.1;      // лот
extern int StopLoss       = 300;      // лось
extern int TakeProfit     = 700;      // язь
extern int TrailingStop   = 35;       // трал
extern int CloseTime      = 10;       // через сколько секунд закрываем ордер
extern int Delta          = 30;       // дельта
extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
// Скачивает исходный код страницы HTML  в текстовую переменную      |
//                и возвращает как результат                         |
//+------------------------------------------------------------------+
string ReadHTML()
  {
   if(!IsDllsAllowed())
     {
      Alert("Необходимо в настройках разрешить использование DLL");
      return("");
     }
   int rv = InternetAttemptConnect(0);
   if(rv != 0)
     {
      Alert("Ошибка при вызове InternetAttemptConnect()");
      return("");
     }
   int hInternetSession=InternetOpenW("Microsoft Internet Explorer",0,"","",0);
   if(hInternetSession<=0)
     {
      Alert("Ошибка при вызове InternetOpenW()");
      return("");
     }
   int hURL=InternetOpenUrlW(hInternetSession,URL,"",0,0,0);
   if(hURL<=0)
     {
      Alert("Ошибка при вызове InternetOpenUrlW()");
      InternetCloseHandle(hInternetSession);
      return("");
     }
   int cBuffer[256];
   int dwBytesRead[1];
   string TXT="";
   while(!IsStopped())
     {
      bool bResult=InternetReadFile(hURL,cBuffer,1024,dwBytesRead);
      if(dwBytesRead[0]==0)
         break;
      string text = "";
      string text0= "";
      for(int i=0; i<256; i++)
        {
         text0=CharToStr((char)(cBuffer[i]&0x000000FF));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(8  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(16  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

         text0=CharToStr((char)(cBuffer[i]>>(24  &0x000000FF)));
         if(text0!="\r") text=text+text0;
         else dwBytesRead[0]--;
         if(StringLen(text)==dwBytesRead[0]) break;

        }
      TXT=TXT+text;
      Sleep(1);
     }
   InternetCloseHandle(hInternetSession);
   return(TXT);
  }
//+------------------------------------------------------------------+
//| Простой трал                                                     |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==OP_SELL)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Время открытия позиции                                           |
//+------------------------------------------------------------------+
datetime TimeOrderOpen()
  {
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int delta=0;
   string s=ReadHTML();
   int sf=StringFind(s,SubString);
   string bid=StringSubstr(s,sf+12,6);

   if(TrailingStop>0) Trailing();
   
   if(TimeCurrent()-TimeOrderOpen()>CloseTime) CloseAll();

   if((double)bid-Bid>Delta*Point) PutOrder(0,Ask);
   if(Bid-(double)bid>Delta*Point) PutOrder(1,Bid);

   Comment("\n Investig Bid: ",bid);
  }
//+------------------------------------------------------------------+



П.С. Советник написан в качестве учебного примера. Дело теперь за немногим т.е. поиском быстрых котировок в сети, которые можно спарсить из кода HTML и поиски брокера, который позволит торговать подобным образом и выводить деньги :) 
Котировки с сайта LMAX таким образом не получить, там нужен другой подход.

Скачать советник: www.opentraders.ru/downloads/1322/
  • +4
  • Просмотров: 1622
  • 17 сентября 2016, 15:51
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Работаем с группой ордеров
15 сентября 2016
26 сентября 2016

Комментарии (1)

+
0
а Я про разницу в скорости брокера от Ранеева слышал! Кто в теме — тот поймёт;) 
avatar

  10  Kashtan Сообщений: 481 - Игорь

  • 25 сентября 2016, 15:47

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари

 
Как начать: открываем первую торговую сделку за 7 шагов →