- Кто может помочь с экспертом?
- Помочь вправить скрипт/советник
- Сделал советник на определенную пару EURUSD ! модератор не пропускает .
хочу написать код для открытия ордера при определенном количестве пунктов в одном тике. Т.е если тик=>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.
хочу написать код для открытия ордера при определенном количестве пунктов в одном тике. Т.е если тик=>20pips то открытие бая ну и т.д
Вот очень упрощённый пример:
//+------------------------------------------------------------------+ //| 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" - в ней будет хранится значение цены на предыдущем тике.
Чтобы получить из цены пункты нужно разницу между двумя ценами умножить на 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 значит открываем бай, что то вроде этого то есть код для анализа каждого тика, сколько в нем пунктов
но это не будет работать на каждом тике, я имею ввиду чтобы допустим так было
1 тик - 1,30256
2 тик - 1,30296
3 тик - 1,30315
код анализирует на новой свече каждый тик, если тик = 20 pips значит открываем бай, что то вроде этого то есть код для анализа каждого тика, сколько в нем пунктов
В тике нет пунктов. В тике есть цена. А вот если эту (текущую) цену сравнить с предыдущей ценой, то можно получить уже дельту (разницу) между этими ценами.
double temp=prev_price-price; тут вычисление между последней ценой и предыдущей? double rezult=temp*MathPow(10,Digits()); тут понятно что происходит prev_price=price; тут не совсем понимаю if(rezult>InpPips) а здесь выдает ошибку, InpPips - кол-во пунктов?
понял,
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()
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' - функция может быть объявлена только в глобальном масштабе
что мои кривые руки делают не так?)
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) { //--- } //+------------------------------------------------------------------+
int init() - нет такой функции
int start() - нет такой функции
Для образца - вот все стандартные функции, которые могут быть в эксперте:
Есть такие функции. Не путайте человека, а лучше объясните ему, что это устаревшие функции mql4, и теперь вместо них лучше использовать OnInit() и OnTick() соответственно.
Тем более, что если логически рассуждать, и видя, что он их пишет в своём коде, то это означает лишь одно - ему нужна помощь по mql4. А вы таким людям не помогаете - это ваши слова.
А вообще - веточка оч интересная получилась для программистов mql
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования