АвторСообщение



Сообщение: 1
Зарегистрирован: 15.10.16
Репутация: 0
ссылка на сообщение  Отправлено: 15.10.16 17:52. Заголовок: советние открывает ордера на каждом тике


проблема в том, что советник открывает ордера на каждом тике, а мне нужно только когда соответсвует условиям в программе
как можно решить эту проблему?
//+------------------------------------------------------------------+
//| 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 |
//+------------------------------------------------------------------+
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-100*Point,Bid+150*Point,0,444,0,clrBlue);// открываем бай
OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+100*Point,Ask-150*Point,0,444,0,clrRed); // открываем селл

}
for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,..
{ //отражённым в терминале
if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
{
OrderSelect(444,SELECT_BY_TICKET);
OrderSelect(444,SELECT_BY_TICKET);

}
} //Конец тела цикла

}

else Print("SymbolInfoTick() failed, error = ",GetLastError());
}



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]







Сообщение: 2359
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 15.10.16 19:34. Заголовок: kirill пишет: пробл..


kirill пишет:

 цитата:
проблема в том, что советник открывает ордера на каждом тике, а мне нужно только когда соответсвует условиям в программе
как можно решить эту проблему?


Потому что на каждом тике выполняется условие:

 цитата:
if(rezult>InpPips)


Посмотрите, чему равен rezult: это разность в пунктах между текущей ценой и нулем (в переменную price до этого момента ничего, кроме нуля, еще не было записано):

 цитата:
prev_price=last_tick.bid;

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


Ошибка заключается в том, что значение price каждый раз инициализируется нулем, но потом не заполняется. На мой взгляд здесь нужно сделать так:

 цитата:
price = last_tick.bid;

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



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 2360
Зарегистрирован: 03.03.13
Откуда: Украина, Каменское (Днепродзержинск)
Репутация: 3
ссылка на сообщение  Отправлено: 15.10.16 19:39. Заголовок: И еще непонятен прак..


И еще непонятен практический смысл вот этого блока:

 цитата:
for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,..
{ //отражённым в терминале
if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
{
OrderSelect(444,SELECT_BY_TICKET);
OrderSelect(444,SELECT_BY_TICKET);

}
} //Конец тела цикла


Происходит выбор ордера по индексу в списке, а потом вдруг переключаемся на выбор ордера по тикету. Причем в качестве тикета указывается Magic Number. Не путайте два этих термина. Хотя даже при исправлении все равно блок остается совершенно бессмысленным.

Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 21
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет