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





Сообщение: 122
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 14.04.14 09:56. Заголовок: Я в шоке! Подскажите.


Всем привет!
Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4?
Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них.
http://gfile.ru/a8cCP
Хотя не перекомпилированные файлы работают.
Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму.
Буду благодарен, если найдешь время исправить.



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 203 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All [только новые]





Сообщение: 4
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 19.09.14 23:30. Заголовок: Scriptong пишет: По..


Scriptong пишет:

 цитата:
Пожалуйста. Обращайтесь.


Снова приветствую! Уважаемый Игорь есть еще просьба. Вложенный в архиве есть индикатор и советник. С кодом нету ни каких проблему, но не работает в новым билдом метатрейдера(компилируется без ошибки). Помогите пожалуйста?!
http://qclk.ru/ks/0IUp


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 838
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 20.09.14 18:57. Заголовок: Husanboy пишет: С к..


Husanboy пишет:

 цитата:
С кодом нету ни каких проблему, но не работает в новым билдом метатрейдера(компилируется без ошибки). Помогите пожалуйста?!



В прежней версии этот индикатор состоял из 2- частей - сам индикатор RSH.mq4 в котором был такой вызов второго индикатора HullMA.mq4
rel=(iCustom(NULL,0,"HullMA",periodoMA,tipoPrecio,tipoPromedio,0,k)-iCustom(NULL,0,"HullMA",periodoMA,tipoPrecio,tipoPromedio,0,i+1))+iCustom(NULL,0,"HullMA",periodoMA,tipoPrecio,tipoPromedio,0,i)-iCustom(NULL,0,"HullMA",periodoMA,tipoPrecio,tipoPromedio,0,k+1);

В Вашей версии индикатор HullMA введен в индикатор RSH в виде функции и вызов теперь выглядит так:
rel=hma[x]-hma[x+1];

Я взял старую отдельную версию индикатора HullMA и накинул ее на график - она ничего не рисует. Так что проблема в этой части индикатора и
функция hma не работает.
Если получится найти причину и заставить работать hma, то и RSH начнет выдавать сигналы советнику.

Старая версия RSH и HullMA лежит здесь - на FOREX TSD




С уважением! Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 839
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 20.09.14 20:26. Заголовок: Нашел рабочую версию..


Нашел рабочую версию HullMA от Mladen - Здесь

Так что можно посмотреть как работает советник со старой версией RSH и новой HullMA

С уважением! Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 5
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 20.09.14 21:29. Заголовок: Genry пишет: Нашел..


Genry пишет:

 цитата:

Нашел рабочую версию HullMA от Mladen - Здесь

Так что можно посмотреть как работает советник со старой версией RSH и новой HullMA

С уважением!



Спасибо за помощь! Я сам исправил и это работает.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 840
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация: 2
ссылка на сообщение  Отправлено: 21.09.14 09:12. Заголовок: Husanboy пишет: Спа..


Husanboy пишет:

 цитата:
Спасибо за помощь! Я сам исправил и это работает.



Ok!

С уважением! Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 159
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 11.11.14 12:37. Заголовок: Делаю советник, одна..


Делаю советник, одна из функций которого, при параметре Symbols=false (не учитывать текущий символ) закрывать все открытые ордера, по всем валютным парам.

FindOrders();
if (CommonProfit>Profit || CommonProfit<-AccountBalance()/100*Loss)
{
while (true)
{
CloseAllOrders();
FindOrders();
if (BuyCount==0 && SellCount==0) break;
}
}

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров. |
//+-------------------------------------------------------------------------------------+
void FindOrders()
{
//----
BuyCount = 0; SellCount = 0;
CommonProfit = 0;
//----
for (int i = 0; i < OrdersTotal(); i++) // Используется весь список ордеров
if (OrderSelect(i, SELECT_BY_POS)) // Убедимся, что ордер выбран
if ((OrderMagicNumber() == MagicNumber || MagicNumber<0) // Ордер соответствует настройкам MagicNumber
&& (OrderSymbol() == Symbol() || !Symbols)) // Ордер соответствует настройкам валютной паре
{
CommonProfit += OrderProfit()+OrderSwap(); // Подсчет совокупного профита
if (OrderType() == OP_SELL) SellCount++;
if (OrderType() == OP_BUY) BuyCount++;
}
}
//=======================================================================================

//+-------------------------------------------------------------------------------------+
//| Закрытие позиций |
//+-------------------------------------------------------------------------------------+
void CloseAllOrders()
{
for (int i = 0; i < OrdersTotal(); i++) // Используется весь список ордеров
if (OrderSelect(i, SELECT_BY_POS)) // Убедимся, что ордер выбран
if ((OrderMagicNumber() == MagicNumber || MagicNumber<0) // Ордер соответствует настройкам MagicNumber
&& (OrderSymbol() == Symbol() || !Symbols)) // Ордер соответствует настройкам валютной пары

if (WaitForTradeContext())
{
if (OrderType()==OP_BUY)
if(OrderClose(OrderTicket(), OrderLots(), NT(Bid), Slippeg))
continue;
if (OrderType()==OP_SELL)
if(OrderClose(OrderTicket(), OrderLots(), NT(Ask), Slippeg))
continue;
}
}
//=======================================================================================

Однако, как только параметр устанавливается Symbols=false, советник виснет, когда поступает команда на закрытие позиций, хотя с текущим символом (при Symbols=true) проблем таких нет.
В чем причина,понять не могу.

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





Сообщение: 946
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 11.11.14 14:24. Заголовок: Sergey пишет: В чем..


Sergey пишет:

 цитата:
В чем причина,понять не могу.


Такой код не сможет закрыть рыночные ордера, открытые по символам, отличным от текущего, т. к. цена закрытия указывается в ценах текущего символа. Для мультивалютных программ следует использовать такую конструкцию закрытия:

 цитата:

double closePrice = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID);
if (OrderType() == OP_SELL)
closePrice = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);

if (OrderClose(OrderTicket(), OrderLots(), closePrice, Slippeg))
continue;


Думаю, во время зависаний в журнале эксперта было огромное количество ошибок - неправильные цены.

Также при закрытии ордеров необходимо использовать обратный цикл перебора, а то будете закрывать ордера через один. Ну и не лучшее решение делать бесконечные циклы (while(true)). Как минимум, нужно использовать !IsStopped().



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





Сообщение: 161
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 11.11.14 14:36. Заголовок: Scriptong пишет: Т..


Scriptong пишет:


 цитата:
Такой код не сможет закрыть рыночные ордера, открытые по символам, отличным от текущего, т. к. цена закрытия указывается в ценах текущего символа. Для мультивалютных программ следует использовать такую конструкцию закрытия:



Блин! Вот я ...... Спасибо!

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





Сообщение: 162
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 13.11.14 16:58. Заголовок: Индикатор виснет на ..


При компиляции выпадает предупреждение old_color и old_startTime (possible loss of data due to type conversion)
Как правильно вывести данные по объекту?

double old_y1=ObjectGet(ObjName, OBJPROP_PRICE1);
double old_y2=ObjectGet(ObjName, OBJPROP_PRICE2);
color old_color=ObjectGet(ObjName, OBJPROP_COLOR);
datetime old_startTime=ObjectGet(ObjName, OBJPROP_TIME1);
Аналогично для
int A=round(B);
Как преобразовать данные? В учебнике ничего нет, или не могу найти где смотреть.

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





Сообщение: 163
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 16.11.14 08:49. Заголовок: Возможно мой вопрос ..


Возможно мой вопрос был не замечен, а потому просто повторюсь.

Sergey пишет:


 цитата:
В режиме # property strict При компиляции выпадает предупреждение old_color и old_startTime (possible loss of data due to type conversion)
Как правильно теперь вывести данные по объекту?

double old_y1=ObjectGet(ObjName, OBJPROP_PRICE1);
double old_y2=ObjectGet(ObjName, OBJPROP_PRICE2);
color old_color=ObjectGet(ObjName, OBJPROP_COLOR);
datetime old_startTime=ObjectGet(ObjName, OBJPROP_TIME1);

Аналогично для
int A=round(B);
Как преобразовать данные? В учебнике ничего нет, или не могу найти где смотреть.



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





Сообщение: 962
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 16.11.14 16:05. Заголовок: Sergey пишет: Возмо..


Sergey пишет:

 цитата:
Возможно мой вопрос был не замечен, а потому просто повторюсь.


Да, действительно, не заметил. Прошу прощения.

Sergey пишет:

 цитата:
При компиляции выпадает предупреждение old_color и old_startTime (possible loss of data due to type conversion)
Как правильно вывести данные по объекту?

double old_y1=ObjectGet(ObjName, OBJPROP_PRICE1);
double old_y2=ObjectGet(ObjName, OBJPROP_PRICE2);
color old_color=ObjectGet(ObjName, OBJPROP_COLOR);
datetime old_startTime=ObjectGet(ObjName, OBJPROP_TIME1);
Аналогично для
int A=round(B);
Как преобразовать данные? В учебнике ничего нет, или не могу найти где смотреть.


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

Суть проблемы заключается в том, что функция ObjectGet возвращает значение типа double, которое в коде присваивается типам color и datetime соответственно. Таким образом, имеем неявное приведение типов данных с возможной потерей точности значения. Именно об этом напоминает компилятор, заботясь о том, чтобы программа оперировала валидными данными.
Для решения вопроса есть два пути:

1. Использовать явное приведение типов, указав компилятору о том, что мы осознаем риск приведения типов и считаем, что в данном случае оно никак не скажется на работоспособности программы. Явное приведение типов выглядит так:

 цитата:
color old_color=(color)ObjectGet(ObjName, OBJPROP_COLOR);
datetime old_startTime=(datetime)ObjectGet(ObjName, OBJPROP_TIME1);
int A = (int)round(B);



2. Использовать специальные функции нового MQL4. Правда, для переменных типа color и datetime этот способ не поможет - нет для них специальных функций. А потому все равно придется прибегать к явному приведению:

 цитата:
color old_color=(color)ObjectGetInteger(0, ObjName, OBJPROP_COLOR);
datetime old_startTime=(datetime)ObjectGetInteger(0, ObjName, OBJPROP_TIME, 1);



Тем не менее, второй способ выгоднее тем, что делает код более универсальным. В будущем такой код будет проще портировать в MQL5.

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





Сообщение: 164
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 16.11.14 18:55. Заголовок: Спасибо! Все понятно..


Спасибо! Все понятно и все работает!

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





Сообщение: 165
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 17.11.14 23:12. Заголовок: Хочу сделать контрол..


Хочу сделать контроль тестового времени эксперта с использованием глобальных переменных.
Проблема в этой строке if (!GlobalVariableGet(ControlTimeExpert, TimeExpertControl)) return; // Вызов гл.пер.
Если ставлю &TimeExpertControl идет ошибка, а без & срабатывает return.
Возможно есть еще ошибки, не знаю.

string ControlTimeExpert;
double TimeExpertControl;
int j_TimeExpertControl;
datetime LastBar;

if (LastBar != iTime(NULL,PERIOD_D1,0)) // Если новый день, то делаем проверку
{
if (!GlobalVariableCheck(ControlTimeExpert)) // Если гл.пер. нет, то создаем
GlobalVariableSet(ControlTimeExpert,TimeCurrent()); // Время первого запуска советника
if (!GlobalVariableGet(ControlTimeExpert, TimeExpertControl)) return; // Вызов гл.пер.
j_TimeExpertControl=(int)TimeExpertControl;
if (TimeCurrent()>j_TimeExpertControl+7*24*60*60) // 7 суток на проверку
{
Alert("Время тестирования советника истекло");
return;
}
}
LastBar = iTime(NULL,PERIOD_D1,0);

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





Сообщение: 969
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 18.11.14 10:12. Заголовок: На вскидку код верны..


На вскидку код верный, если подразумевать, что приведен только участок кода, а не весь код. Если же это весь код, тогда проблема в том, что переменная ControlTimeExpert не инициализирована. В ней нет названия глобальной переменной, отсюда и проблемы.

А почему выбран такой странный способ контроля? Ведь глобальную переменную пользователь может удалить вручную, что сведет на нет всю защиту. Лучше прописывать абсолютную дату окончания периода тестирования в самом коде. При отсылке конкретному пользователю просто перекомпилировать эксперт:

 цитата:
input datetime i_currentTime = __DATE__;

datetime g_testExpirationDate;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
g_testExpirationDate = i_currentTime + PERIOD_D1 * 60;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (TimeCurrent() > g_testExpirationDate)
{
Alert("Срок демо-версии истек. Советник отключен!");
ExpertRemove();
return;
}
}



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





Сообщение: 166
Зарегистрирован: 05.03.13
Репутация: 1
ссылка на сообщение  Отправлено: 18.11.14 10:35. Заголовок: Для отдельных пользо..


Для отдельных пользователей проблем нет.
Но хочу разместить полнофункциональную демо версию на сайте и не заморачиваться под каждого клиента.

Scriptong пишет:


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



Вообще то это весь код. Но кажется я понял. string ControlTimeExpert= "ControlTimeEA"; Теперь задана как название гл.переменной в начале. Попробую.

Остался вопрос:
Чтобы осознать не бесполезность своих действий, подскажите где хранятся глобальные переменные? Я к примеру не знаю, думаю и большинство трейдеров тоже.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 203 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

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