AM2
Андрей

 
Уровень 35

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


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

Рейтинг 280



Мультивалютник с автодобавлением символов в окно „Обзор рынка“

Сегодня попробовал создать мультивалютного эксперта, торгующего на основе совместного движения валютных пар с автодобавлением символов в окно «Обзор рынка» и это оказалось очень непростой задачей. В самом конце топика приведен весь код эксперта, а для начала разберем алгоритм добавления символов в окно «Обзор рынка».

При инициализации эксперта заполним предварительно созданные массивы для символов и направления торговли:


int trade[1];
string symbols[1];



   if(Symbol1!="")
     {
      ArrayResize(symbols,1);
      ArrayResize(trade,1);
      symbols[0]=Symbol1;
      trade[0]=Symbol1Trade;
     }
   if(Symbol2!="")
     {
      ArrayResize(symbols,2);
      ArrayResize(trade,2);
      symbols[1]=Symbol2;
      trade[1]=Symbol2Trade;
     }
   if(Symbol3!="")
     {
      ArrayResize(symbols,3);
      ArrayResize(trade,3);
      symbols[2]=Symbol3;
      trade[2]=Symbol3Trade;
     }
   if(Symbol4!="")
     {
      ArrayResize(symbols,4);
      ArrayResize(trade,4);
      symbols[3]=Symbol1;
      trade[3]=Symbol1Trade;
     }
   if(Symbol5!="")
     {
      ArrayResize(symbols,5);
      ArrayResize(trade,5);
      symbols[4]=Symbol2;
      trade[4]=Symbol2Trade;
     }
   if(Symbol6!="")
     {
      ArrayResize(symbols,6);
      ArrayResize(trade,6);
      symbols[5]=Symbol3;
      trade[5]=Symbol3Trade;
     }
   if(Symbol7!="")
     {
      ArrayResize(symbols,7);
      ArrayResize(trade,7);
      symbols[6]=Symbol1;
      trade[6]=Symbol1Trade;
     }
   if(Symbol8!="")
     {
      ArrayResize(symbols,8);
      ArrayResize(trade,8);
      symbols[7]=Symbol2;
      trade[7]=Symbol2Trade;
     }
   if(Symbol9!="")
     {
      ArrayResize(symbols,9);
      ArrayResize(trade,9);
      symbols[8]=Symbol3;
      trade[8]=Symbol3Trade;
     }


Затем очистим окно «Обзор рынка»:

// очистим окно обзор рынка
   for(int i=0;i<SymbolsTotal(true);i++)
     {
      SymbolSelect(SymbolName(i,true),false);
     }


И заполним его символами из эксперта:


  for(int i=0;i<ArraySize(symbols);i++)
     {
      SymbolSelect(symbols[i],true);
     }


Здесь есть одна небольшая особенность: функция не удаляет полностью весь список, а оставляет символы открытые на вкладках.



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

Далее напишем мультивалютные варианты функций открытия закрытия позиций и подсчета профита:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(string symb,int type)
  {
   int    r=0;
   color clr=Green;
   double price=0;

   if(type==1)
     {
      clr=Red;
      price=MarketInfo(symb,MODE_BID);
     }

   if(type==0)
     {
      clr=Blue;
      price=MarketInfo(symb,MODE_ASK);
     }

   r=OrderSend(symb,type,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) pr+=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(string symbol)
  {
   int count=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) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(string symb)
  {
   bool cl;
   double bid=MarketInfo(symb,MODE_BID);
   double ask=MarketInfo(symb,MODE_ASK);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symb && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,Digits),Slip,White);
              }
            if(OrderType()==1)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trade(string symb,int type)
  {
   if(CountTrades(symb)<1) PutOrder(symb,type);
   if(AllProfit()>Profit || AllProfit()<-Loss) CloseAll(symb);
  }


На каждом тике будем проверять торговые условия и распечатаем на экране количсетво и название символов и их общий профит:


void OnTick()
  {
   string s="";

   for(int i=0;i<ArraySize(symbols);i++)
     {
      if(symbols[i]!="") s+="\n "+symbols[i];
      Trade(symbols[i],trade[i]);
     }

   Comment("\n Symbols Count: ",ArraySize(symbols),s,
           "\n All Profit: ",AllProfit());
  }


Вот и весь эксперт:


//+------------------------------------------------------------------+
//|                                                 MultySymbols.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

input string Symbol1      = "CADCHF";       // Symbol1 Name
input int    Symbol1Trade = 0;              // 0-Buy 1-Sell
input string Symbol2      = "GBPJPY";       // Symbol2 Name
input int    Symbol2Trade = 0;              // 0-Buy 1-Sell
input string Symbol3      = "NZDUSD";       // Symbol3 Name
input int    Symbol3Trade = 0;              // 0-Buy 1-Sell
input string Symbol4      = "";             // Symbol4 Name
input int    Symbol4Trade = 0;              // 0-Buy 1-Sell
input string Symbol5      = "";             // Symbol5 Name
input int    Symbol5Trade = 0;              // 0-Buy 1-Sell
input string Symbol6      = "";             // Symbol6 Name
input int    Symbol6Trade = 0;              // 0-Buy 1-Sell
input string Symbol7      = "";             // Symbol7 Name
input int    Symbol7Trade = 0;              // 0-Buy 1-Sell
input string Symbol8      = "";             // Symbol8 Name
input int    Symbol8Trade = 0;              // 0-Buy 1-Sell
input string Symbol9      = "";             // Symbol9 Name
input int    Symbol9Trade = 0;              // 0-Buy 1-Sell

input double Lots         = 0.1;            // лот
input double Profit       = 20;             // лось в рублях
input double Loss         = 5000;           // язь  в рублях
input int    Slip         = 30;             // реквот
input int    Magic        = 333;            // магик

int trade[1];
string symbols[1];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Symbol1!="")
     {
      ArrayResize(symbols,1);
      ArrayResize(trade,1);
      symbols[0]=Symbol1;
      trade[0]=Symbol1Trade;
     }
   if(Symbol2!="")
     {
      ArrayResize(symbols,2);
      ArrayResize(trade,2);
      symbols[1]=Symbol2;
      trade[1]=Symbol2Trade;
     }
   if(Symbol3!="")
     {
      ArrayResize(symbols,3);
      ArrayResize(trade,3);
      symbols[2]=Symbol3;
      trade[2]=Symbol3Trade;
     }
   if(Symbol4!="")
     {
      ArrayResize(symbols,4);
      ArrayResize(trade,4);
      symbols[3]=Symbol1;
      trade[3]=Symbol1Trade;
     }
   if(Symbol5!="")
     {
      ArrayResize(symbols,5);
      ArrayResize(trade,5);
      symbols[4]=Symbol2;
      trade[4]=Symbol2Trade;
     }
   if(Symbol6!="")
     {
      ArrayResize(symbols,6);
      ArrayResize(trade,6);
      symbols[5]=Symbol3;
      trade[5]=Symbol3Trade;
     }
   if(Symbol7!="")
     {
      ArrayResize(symbols,7);
      ArrayResize(trade,7);
      symbols[6]=Symbol1;
      trade[6]=Symbol1Trade;
     }
   if(Symbol8!="")
     {
      ArrayResize(symbols,8);
      ArrayResize(trade,8);
      symbols[7]=Symbol2;
      trade[7]=Symbol2Trade;
     }
   if(Symbol9!="")
     {
      ArrayResize(symbols,9);
      ArrayResize(trade,9);
      symbols[8]=Symbol3;
      trade[8]=Symbol3Trade;
     }
     
// очистим окно обзор рынка
   for(int i=0;i<SymbolsTotal(true);i++)
     {
      SymbolSelect(SymbolName(i,true),false);
     }

// заполним символами из советника
   for(int i=0;i<ArraySize(symbols);i++)
     {
      SymbolSelect(symbols[i],true);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(string symb,int type)
  {
   int    r=0;
   color clr=Green;
   double price=0;

   if(type==1)
     {
      clr=Red;
      price=MarketInfo(symb,MODE_BID);
     }

   if(type==0)
     {
      clr=Blue;
      price=MarketInfo(symb,MODE_ASK);
     }

   r=OrderSend(symb,type,Lots,NormalizeDouble(price,Digits),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) pr+=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(string symbol)
  {
   int count=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) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(string symb)
  {
   bool cl;
   double bid=MarketInfo(symb,MODE_BID);
   double ask=MarketInfo(symb,MODE_ASK);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symb && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,Digits),Slip,White);
              }
            if(OrderType()==1)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trade(string symb,int type)
  {
   if(CountTrades(symb)<1) PutOrder(symb,type);
   if(AllProfit()>Profit || AllProfit()<-Loss) CloseAll(symb);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string s="";

   for(int i=0;i<ArraySize(symbols);i++)
     {
      if(symbols[i]!="") s+="\n "+symbols[i];
      Trade(symbols[i],trade[i]);
     }

   Comment("\n Symbols Count: ",ArraySize(symbols),s,
           "\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+




П.С. Надеюсь на основе готового кода вам будет проще разрабатывать свои эксперты, т.к. разбираться с нуля дело довольно таки длительное.

Скачать файлом: www.opentraders.ru/downloads/1336/
  • +5
  • Просмотров: 6631
  • 26 сентября 2016, 10:02
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

+
0
Видит только три пары (
avatar

  2  Hi-Fi Сообщений: 1

  • 9 июля 2019, 08:45
+
0
Дык, впиши столько пар, сколько твоей душе угодно, делов-то…
avatar

  0  BuTacuk Сообщений: 1

  • 6 сентября 2020, 19:00

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