Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вся деятельность участников MQL5.community. Заходи в раздел Стена!
Kirill Andreev
823
Kirill Andreev 2016.09.26 16:10 
хочу написать код для открытия ордера при определенном количестве пунктов в одном тике. Т.е если тик=>20pips то открытие бая ну и т.д 
Vladimir Karputov
Модератор
42384
Vladimir Karputov 2016.09.26 16:30  
Kirill Andreev:
хочу написать код для открытия ордера при определенном количестве пунктов в одном тике. Т.е если тик=>20pips то открытие бая ну и т.д 

Чтобы получить из цены пункты нужно разницу между двумя ценами умножить на 10 в степени Digits(). Для примера имеем две цены: 1.20302 и 1.20281. Как видите здесь пять разрядов после запятой. Разница между этими двумя ценами будет равна 0.00021. Чтобы перевести 0.00021 в пункты, нужно это число умножить на 10 в степени 5:

   double temp=1.20302-1.20281;
   double rezult=temp*MathPow(10,Digits());

rezult==21.

Alexander Antoshkin
1536
Alexander Antoshkin 2016.09.26 16:31  
Kirill Andreev:
хочу написать код для открытия ордера при определенном количестве пунктов в одном тике. Т.е если тик=>20pips то открытие бая ну и т.д 
Кирил внеси поправочку что для мт4  , а то наговарят лишнее
Vladimir Karputov
Модератор
42384
Vladimir Karputov 2016.09.26 16:45  

Вот очень упрощённый пример:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static double prev_price=0;
   double price=0;
//---
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      prev_price=last_tick.bid;

      double temp=prev_price-price;
      double rezult=temp*MathPow(10,Digits());
      prev_price=price;

      if(rezult>InpPips)
        {
         // что-то делаем
        }
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }

Внимание: при первом запуске этот код отработает некорректно, также здесь не учитывается в какую сторону изменилась цена: в "+" или в "-".

 

В коде вводятся статическая переменная "prev_price" - в ней будет хранится значение цены на предыдущем тике.

Kirill Andreev
823
Kirill Andreev 2016.09.26 16:48  
Karputov Vladimir:

Чтобы получить из цены пункты нужно разницу между двумя ценами умножить на 10 в степени Digits(). Для примера имеем две цены: 1.20302 и 1.20281. Как видите здесь пять разрядов после запятой. Разница между этими двумя ценами будет равна 0.00021. Чтобы перевести 0.00021 в пункты, нужно это число умножить на 10 в степени 5:

rezult==21.

но это не будет работать на каждом тике, я имею ввиду чтобы допустим так было

1 тик - 1,30256

2 тик - 1,30296

3 тик - 1,30315

код анализирует на новой свече каждый тик, если тик = 20 pips значит открываем бай, что то вроде этого то есть код для анализа каждого тика, сколько в нем пунктов 

Vladimir Karputov
Модератор
42384
Vladimir Karputov 2016.09.26 16:51  
Kirill Andreev:

но это не будет работать на каждом тике, я имею ввиду чтобы допустим так было

1 тик - 1,30256

2 тик - 1,30296

3 тик - 1,30315

код анализирует на новой свече каждый тик, если тик = 20 pips значит открываем бай, что то вроде этого то есть код для анализа каждого тика, сколько в нем пунктов 

В тике нет пунктов. В тике есть цена. А вот если эту (текущую) цену сравнить с предыдущей ценой, то можно получить уже дельту (разницу) между этими ценами.
Kirill Andreev
823
Kirill Andreev 2016.09.26 17:07  
Karputov Vladimir:
В тике нет пунктов. В тике есть цена. А вот если эту (текущую) цену сравнить с предыдущей ценой, то можно получить уже дельту (разницу) между этими ценами.
понял, 
      double temp=prev_price-price;                 тут вычисление между последней ценой и предыдущей? 
      double rezult=temp*MathPow(10,Digits());          тут понятно что происходит
      prev_price=price;                               тут не совсем понимаю 

      if(rezult>InpPips)                                а здесь выдает ошибку, InpPips - кол-во пунктов? 
Vladimir Karputov
Модератор
42384
Vladimir Karputov 2016.09.26 17:18  
Kirill Andreev:
понял, 

prev_price=price;  - здесь мы сохраняем текущую цену "price" в переменную "prev_price". Переменная "prev_price" у нас статическая - она сохраняет своё значение между тиками, то есть при следующем входе в OnTick() в переменной "prev_price" будет сохранена цена с предыдущего тика.

Вот более развёрнуто:

  • текущий тик, цена 1.20301. В переменную "prev_price" сохраняем значение 1.20301. 
  • следующий тик, цена 1.20321. Сравниваем текущую цену (1.20321) с ценой на предыдущем тике (эта цена у нас сохранена в переменной "prev_price")

InpPips - да это заданное количество пунктов. Эту переменную нужно объявлять в шапке, примерно так:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameter
input double InpPips=20;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
Kirill Andreev
823
Kirill Andreev 2016.09.26 17:48  
Karputov Vladimir:

prev_price=price;  - здесь мы сохраняем текущую цену "price" в переменную "prev_price". Переменная "prev_price" у нас статическая - она сохраняет своё значение между тиками, то есть при следующем входе в OnTick() в переменной "prev_price" будет сохранена цена с предыдущего тика.

Вот более развёрнуто:

  • текущий тик, цена 1.20301. В переменную "prev_price" сохраняем значение 1.20301. 
  • следующий тик, цена 1.20321. Сравниваем текущую цену (1.20321) с ценой на предыдущем тике (эта цена у нас сохранена в переменной "prev_price")

InpPips - да это заданное количество пунктов. Эту переменную нужно объявлять в шапке, примерно так:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
// Переменные, изменяемые программно
int Corr;                    // Автоматический корректор котировок, 10 для 5-значных котировок и 1 для 4-значных
int TwoDigCorr;              // Корректор для работы с двухзначными котировками
bool New_Bar=false;          // Флаг образования нового бара
int Oppoz;                   // Флаг выставления противоположной отложки при СЛ
int TradeFlag;               // Флаг возможности открытия сделок
//--- input parameter
input double InpPips=20;
extern double Lot=0.01;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
 // Проверка необходимых для работы условий
  if (IsTradeAllowed())
   Alert("Работа советника  по символу ",Symbol()," начата.");
  else
  {
  Alert("Торговля советниками не разрешена! Советник не будет работать. Проверьте настройки Вашего терминала.");
  }
  // Проверка пользовательских объемов
    double Mlot=MarketInfo(Symbol(),MODE_MINLOT);
    if(Lot<Mlot)
     {
      Alert("Недопустимо маленькое значение объема сделок. Объем установлен на допустимый минимум!");
      Print("Недопустимо маленькое значение объема сделок. Объем установлен на допустимый минимум!");
      Lot=Mlot;
     }
  // Инициализация первичных данных
   if (Point==0.0001) Corr=1;
     else Corr=10;
     if(Digits==2) TwoDigCorr=10;
    else TwoDigCorr=1;
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
void OnTick()
  {
//---
   static double prev_price=0;
   double price=0;
//---
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      prev_price=last_tick.bid;

      double temp=prev_price-price;
      double rezult=temp*MathPow(10,Digits());
      prev_price=price;

      if(rezult>InpPips)
        {
         OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Bid-10*Point,Bid-15*Point,0,clrDarkGreen);// открываем бай
         OrderSend(Symbol(),OP_SELL,0.01,Ask,3,Bid-10*Point,Bid-15*Point,0,clrGreen); // открываем селл
        }
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 return(0);
  }
  

     написал такую штуку, пишет что  - 'OnTick' - функция может быть объявлена ​​только в глобальном масштабе

что мои кривые руки делают не так?) 

Vladimir Karputov
Модератор
42384
Vladimir Karputov 2016.09.26 17:52  

int init() - нет такой функции

int start() - нет такой функции

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

//+------------------------------------------------------------------+
//|                                                all_functions.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| TesterInit function                                              |
//+------------------------------------------------------------------+
void OnTesterInit()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| TesterPass function                                              |
//+------------------------------------------------------------------+
void OnTesterPass()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| TesterDeinit function                                            |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
   
  }
//+------------------------------------------------------------------+
Файлы:
Artyom Trishkin
Модератор
73921
Artyom Trishkin 2016.09.26 20:32  
Karputov Vladimir:

int init() - нет такой функции

int start() - нет такой функции

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

Есть такие функции. Не путайте человека, а лучше объясните ему, что это устаревшие функции mql4, и теперь вместо них лучше использовать OnInit() и OnTick() соответственно.

Тем более, что если логически рассуждать, и видя, что он их пишет в своём коде, то это означает лишь одно - ему нужна помощь по mql4. А вы таким людям не помогаете - это ваши слова.

А вообще - веточка оч интересная получилась для программистов mql

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