Ответить
26.05.2015, 06:45
Аватар для ansol
ansol ansol на форуме
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
Может просто эти строки нужно не в Онините прописать, а в Онтике в первых строках (Старте) - тогда сов не будет работать, а в Онините прошла проверка или нет, только ретерн что-то выдал и все, дальше сов работает.
MT4 build 765 (12 Dec 2014) при неверном счете выдает:
2015.05.26 11:42:33.090 AnSol-ZOG3 EURUSD,M5: initialization failed (32767)
2015.05.26 11:42:33.090 AnSol-ZOG3 EURUSD,M5: uninit reason 8
2015.05.26 11:42:35.079 Expert AnSol-ZOG3 EURUSD,M5: removed

И никто никуда не работает.
Все проверено, с какой целью спорите?
26.05.2015, 07:08
Аватар для vladradon
vladradon vladradon на форуме Активный участник
Регистрация: 12.02.2015 / Сообщений: 144
Поблагодарили 58 раз(а) / Репутация: 57
Лучше в ините по условию несовпадения номера счёта выполнить ExpertRemove();
Только я заметил такую особенность, сначала выполняется весь код, а потом советник выгружается. Тоесть если в ините прописано открытие ордеров, то они будут открыты независимо от того, что ExpertRemove(); прописан раньше чем OrderSend() и условие выгрузки советника выполнено.
Согласен - пока редактировал свое сообщение, ты мои мысли прописал...))) Только в Онините не будут выполняться команды по торговле, поэтому не вижу разницы куда втыкать ExpertRemove() - в Онинит или в начало Онтик (Старт). Этот вопрос не так давно уже обсуждался несколько страниц назад и я там предложил как раз подбные варианты.
26.05.2015, 07:14
Аватар для vladradon
vladradon vladradon на форуме Активный участник
Регистрация: 12.02.2015 / Сообщений: 144
Поблагодарили 58 раз(а) / Репутация: 57
MT4 build 765 (12 Dec 2014) при неверном счете выдает:
2015.05.26 11:42:33.090 AnSol-ZOG3 EURUSD,M5: initialization failed (32767)
2015.05.26 11:42:33.090 AnSol-ZOG3 EURUSD,M5: uninit reason 8
2015.05.26 11:42:35.079 Expert AnSol-ZOG3 EURUSD,M5: removed

И никто никуда не работает.
Все проверено, с какой целью спорите?
Может человеку просто в сове нужно защиту сделать, чтобы была привязка к определенному счету, который он сам пропишет в коде и уже скомпиллированный сов продаст с этой защитой. Я не с целью - просто пишу то, что проверено и сам использую.
26.05.2015, 07:28
Аватар для ansol
ansol ansol на форуме
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
Может человеку просто в сове нужно защиту сделать, чтобы была привязка к определенному счету, который он сам пропишет в коде и уже скомпиллированный сов продаст с этой защитой. Я не с целью - просто пишу то, что проверено и сам использую.
А мой кусок выше это и делает! Просто можно вынести Account во входные переменные, а можно(как и написано выше) в общие, после компиляции значения видно не будет, а эксперт вылетит со свистом, если номер счета не совпадет.
Я все понял, что чел хотел сделать и предложил самый простой работающий вариант.
26.05.2015, 09:15
Аватар для vladradon
vladradon vladradon на форуме Активный участник
Регистрация: 12.02.2015 / Сообщений: 144
Поблагодарили 58 раз(а) / Репутация: 57
А мой кусок выше это и делает! Просто можно вынести Account во входные переменные, а можно(как и написано выше) в общие, после компиляции значения видно не будет, а эксперт вылетит со свистом, если номер счета не совпадет.
Я все понял, что чел хотел сделать и предложил самый простой работающий вариант.
Все правильно, но только этот кусок кода нужно правильно разместить, как описал выше.
26.05.2015, 09:25
Аватар для ansol
ansol ansol на форуме
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
Все правильно, но только этот кусок кода нужно правильно разместить, как описал выше.
Напоминает разговор с глухим - я же написал по-русски: это все прямо сию минут работает именно так, как написано выше с размещением в функции OnInit()
Какие проблемы-то?
26.05.2015, 11:09
Аватар для vladradon
vladradon vladradon на форуме Активный участник
Регистрация: 12.02.2015 / Сообщений: 144
Поблагодарили 58 раз(а) / Репутация: 57
Напоминает разговор с глухим - я же написал по-русски: это все прямо сию минут работает именно так, как написано выше с размещением в функции OnInit()
Какие проблемы-то?
Функция OnInit() не является даже изначально командной, т.е. она фиксирует общие параметры работы сова. Единственная команда, которая может запретить работу сова - ExpertRemove() в этой функции.

Последний раз редактировалось NSerega; 26.05.2015 в 14:24.
26.05.2015, 11:35
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
_http://docs.mql4.com/ru/basis/function/events
если return(INIT_SUCCEEDED), то работа продолжится.
если return(INIT_FAILED), то нет.
Обработаете условиями и дадите нужную команду.
Чтоб не ругался компилятор делайте:
"int OnInit()" вместо "void OnInit()"
26.05.2015, 11:55
Аватар для ansol
ansol ansol на форуме
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
_http://docs.mql4.com/ru/basis/function/events
если return(INIT_SUCCEEDED), то работа продолжится.
если return(INIT_FAILED), то нет.
Обработаете условиями и дадите нужную команду.
Чтоб не ругался компилятор делайте:
"int OnInit()" вместо "void OnInit()"
Ну, товарищ не панимаает!
Там еще куча кодов есть, по которым обламывается запуск сова, я выбрал
return(INIT_PARAMETERS_INCORRECT) - сов выкидывает, т.е. REMOVE делает.
И проверил, и выжимку из лога журнала экспертов привел - ну, не верит товарищ, шибка вумный, аднака
26.05.2015, 17:13
Аватар для DomovenokBrest
DomovenokBrest DomovenokBrest на форуме ♔♕♖♗♘♙
Регистрация: 27.10.2012 / Адрес: Белоруссия, Брест / Сообщений: 2,300
Поблагодарили 10,445 раз(а) / Репутация: 10473
  • Отправить сообщение для DomovenokBrest с помощью Skype™
Сообщение от: Semenov Semen
Всем привет! Помогите пожалуйста привязать советник к счету. Читал на mql5 форуме что нужно писать int AccountNumber(); и еще что то после int start,а у меня только int OnInit .
Я использую следующий блок защиты. То что не нужно - за комментируй...

Скрытый текст

int start()
{
//| Функции защиты программы |
//+------------------------------------------------------------------+

//Блок "Защита паролем" Этот способ стар, как мир, и используется в большинстве видов лицензионного ПО.
//Вы поставляете пользователю свою программу вместе с паролем, без которого программа не будет работать.

if (password != "**********") //именно этот пароль должен ввести пользователь
{
Alert ("Wrong password!");
return (0);
}

//Блок "Ограничение сроком действия" Если Вы хотите дать пользователю программу для того, чтобы он её протестировал и решил для себя,
//хочет он её покупать или нет, Вы можете сделать так, чтобы Ваша программа перестала работать после определённой даты.

string expire_date = "2015.12.31"; //вшитая дата экспирации
datetime e_d = StrToTime(expire_date);

if (CurTime() >= e_d)
{
Alert ("The trial version has expired!");
return(0);
}


//Блок "Ограничение по номеру счета" Если Вы хотите дать пользователю программу для того, чтобы он её использовал только на
//определенном номере счета, , Вы можете сделать так, чтобы Ваша программа перестала работать на всех других счетах.
string Account = 453593; //Аккаунт номер
if(Account > 0 && Account != AccountNumber())
{
Alert ("AccountNumber - WRONG!");
return(0);
}
//============================================================================
[свернуть]
26.05.2015, 18:42
Аватар для vlad_123
vlad_123 vlad_123 на форуме Местный знаток
Регистрация: 29.01.2013 / Сообщений: 408
Поблагодарили 894 раз(а) / Репутация: 898
Функция OnInit() не является даже изначально командной, т.е. она фиксирует общие параметры работы сова. Единственная команда, которая может запретить работу сова - ExpertRemove() в этой функции.
Т.е. вас не смущает, что в документации написано _http://docs.mql4.com/ru/basis/function/events:
Цитата:
Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED

На заказ не программирую.

Последний раз редактировалось NSerega; 26.05.2015 в 23:36.
27.05.2015, 02:22
Аватар для vladradon
vladradon vladradon на форуме Активный участник
Регистрация: 12.02.2015 / Сообщений: 144
Поблагодарили 58 раз(а) / Репутация: 57
Ну, товарищ не панимаает!
Там еще куча кодов есть, по которым обламывается запуск сова, я выбрал
return(INIT_PARAMETERS_INCORRECT) - сов выкидывает, т.е. REMOVE делает.
И проверил, и выжимку из лога журнала экспертов привел - ну, не верит товарищ, шибка вумный, аднака
Спасибо за разъяснение - теперь буду знать.
Просто не всегда успеваю следить за объединением языков (4 и 5), а раньше на 4-ке такого не было вроде как...
Главное - мы предложили рабочие варианты, а какой использовать, уже сам прогер выберет.

Последний раз редактировалось vladradon; 27.05.2015 в 02:41.
27.05.2015, 17:09
Аватар для Semenov Semen
Semenov Semen Semenov Semen вне форума Прохожий
Регистрация: 24.05.2015 / Сообщений: 3
Поблагодарили 0 раз(а) / Репутация: 1
Пишем
PHP код:
int Account=Номер_счета;
int OnInit() 
  { 
   if(
Account && Account != AccountNumber())  return(INIT_PARAMETERS_INCORRECT);

Какие еще ошибки, если это работает в сове прямо сию минуту?
Если номер заданного вами счета и счета, на котором запущен сов не совпадает, то инициализация завершится с ошибкой и торговать сов не будет.
Ошибки были при компиляции. Сейчас разобрался,всё работает. Спасибо!
30.05.2015, 10:15
Аватар для Dobryj
Dobryj Dobryj вне форума Почётный гражданин
Регистрация: 07.06.2012 / Сообщений: 222
Поблагодарили 294 раз(а) / Репутация: 326
ВСЕМ ПРИВЕТ !
ПОМОГИТЕ ПОЖАЛУЙСТА РАЗОБРАТЬСЯ

Скрытый текст




//+----------------------------------------------------------------------------+
//| Описание : Возвращает наименование торговой операции |
//| op - идентификатор торговой операции |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
}

//+----------------------------------------------------------------------------+
//| |
//| Описание : Возвращает одно из двух значений взависимости от условия. |
//+----------------------------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//| |
//| Описание : Модификация одного предварительно выбранного ордера. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| pp - цена установки ордера |
//| sl - ценовой уровень стопа |
//| tp - ценовой уровень тейка |
//| ex - дата истечения |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
bool fm;
color cl=IIFc(OrderType()==OP_BUY
|| OrderType()==OP_BUYLIMIT
|| OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
double op, pa, pb, os, ot;
int dg=(int)MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();

pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);

if (pp!=op || sl!=os || tp!=ot) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
if (fm) {
if (UseSound) PlaySound(SoundSuccess); break;
} else {
er=GetLastError();
if (UseSound) PlaySound(SoundError);
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
Sleep(1000*10);
}
}
}
}

//+----------------------------------------------------------------------------+
//| |
//| Описание : Перенос уровня стопа в безубыток |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ( "" - любой символ, |
//| NULL - текущий символ) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
po=MarketInfo(OrderSymbol(), MODE_POINT);

if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
}
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом |
//+------------------------------------------------------------------+
void TrailingPositions() {
double pBid, pAsk, pp;
int mw=Magic;
if (mw<0 || OrderMagicNumber()==mw)
{
pp = MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY)
{
pBid = MarketInfo(OrderSymbol(), MODE_BID);
if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp)
{
if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp)
{
ModifyStopLoss(pBid-TrailingStop*pp);
return;
}
}
}
if (OrderType()==OP_SELL)
{
pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp)
{
if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0)
{
ModifyStopLoss(pAsk+TrailingStop*pp);
return;
}
}
}
}
}
//+------------------------------------------------------------------+
//| Перенос уровня StopLoss |
//| Параметры: |
//| ldStopLoss - уровень StopLoss |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+

//открытие позиции

if(t1==Time[0])
{
ObjectDelete("1");
if(Open[1]>Close[1]&&Volume[0]<3)
{
w=OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-sl,Ask+tp,NULL,Magic,0,Green);
}
else if(Open[1]<Close[1]&&Volume[0]<3)
{
w=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,Bid+sl,Bid-tp,NULL,Magic,0,Red);
}
}


//сопровождение позиции
bool B_k = True; // Безубыток
bool TralingStopp = True; //TralingStop

if(B_k==TRUE && TralingStopp == true && OrdersTotal()>0) { MovingInWL("0",-1,Magic);TrailingPositions(); }
if(B_k==TRUE && TralingStopp == False && OrdersTotal()>0) { MovingInWL("0",-1,Magic); }
if(B_k==FALSE && TralingStopp == TRUE && OrdersTotal()>0) { TrailingPositions(); } // при данном условии трал не работает , ошибка неверный тикет


[свернуть]

НЕ РАБОТАЕТ ТРАЛ КОГДА ОТКЛЮЧЕН БЕЗУБЫТОК И ВКЛЮЧЕН ТРАЛ,НО РАБОТАТ КОГДА ДВА УСЛОВИЯ ТРУЕ , МОЖЕТ КТО ДАСТ КУСОК КОДА ПО ТРАЛУ ПОПРОЩЕ

Последний раз редактировалось Dobryj; 30.05.2015 в 10:22.
31.05.2015, 20:26
Аватар для Mirosha
Mirosha Mirosha вне форума Новичок форума
Регистрация: 25.02.2010 / Сообщений: 17
Поблагодарили 4 раз(а) / Репутация: 5
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.
31.05.2015, 21:13
Аватар для Евгений Симашов
Евгений Симашов Евгений Симашов вне форума Новичок форума
Регистрация: 24.05.2015 / Адрес: Орловская обл. / Сообщений: 71
Поблагодарили 17 раз(а) / Репутация: 17
Господа программисты, а есть ли способ, чтоб любая сова начинала торговать только если разрешит уровень CCI?? как это сделать если можно самым простым способом?
------
Мне тут посоветовали примерно так:
if (cci > 100 || cci < -100)
return;
но куда это вставлять после слова START INI или еще куда? и то ли это что надо?..
31.05.2015, 21:16
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.
Если индикатор рисует какие-то графические объекты, то можно их находить и смотреть свойства. Но это, наверняка, не ваш случай. Поэтому ответ - никак.
31.05.2015, 21:20
Аватар для Gnn-life
Gnn-life Gnn-life вне форума Элитный участник
Регистрация: 09.04.2012 / Адрес: Питер / Сообщений: 515
Поблагодарили 1,042 раз(а) / Репутация: 1042
Если индикатор рисует какие-то графические объекты, то можно их находить и смотреть свойства. Но это, наверняка, не ваш случай. Поэтому ответ - никак.
а я бы так однозначно не ответила.....в программе мкл очень много возможностей
31.05.2015, 21:23
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
а я бы так однозначно не ответила.....в программе мкл очень много возможностей
Тогда и я хотел бы знать как это сделать...
31.05.2015, 21:51
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,775
Поблагодарили 9,202 раз(а) / Репутация: 9207
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.
В данном случае сам индикатор не нужен, воспользуйтесь ф-цией iVolume
PHP код:
long  iVolume(
   
string           symbol,          // символ
   
int              timeframe,       // период
   
int              shift            // сдвиг
   
); 
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 21:59. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO