Ваши вопросы по языку MQL4

ansol

Местный знаток
Может просто эти строки нужно не в Онините прописать, а в Онтике в первых строках (Старте) - тогда сов не будет работать, а в Онините прошла проверка или нет, только ретерн что-то выдал и все, дальше сов работает.

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

И никто никуда не работает.
Все проверено, с какой целью спорите?
 

vladradon

Программист
Лучше в ините по условию несовпадения номера счёта выполнить ExpertRemove();
Только я заметил такую особенность, сначала выполняется весь код, а потом советник выгружается. Тоесть если в ините прописано открытие ордеров, то они будут открыты независимо от того, что ExpertRemove(); прописан раньше чем OrderSend() и условие выгрузки советника выполнено.
Согласен - пока редактировал свое сообщение, ты мои мысли прописал...))) Только в Онините не будут выполняться команды по торговле, поэтому не вижу разницы куда втыкать ExpertRemove() - в Онинит или в начало Онтик (Старт). Этот вопрос не так давно уже обсуждался несколько страниц назад и я там предложил как раз подбные варианты.
 

vladradon

Программист
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

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

ansol

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

А мой кусок выше это и делает! Просто можно вынести Account во входные переменные, а можно(как и написано выше) в общие, после компиляции значения видно не будет, а эксперт вылетит со свистом, если номер счета не совпадет.
Я все понял, что чел хотел сделать и предложил самый простой работающий вариант.
 

vladradon

Программист
А мой кусок выше это и делает! Просто можно вынести Account во входные переменные, а можно(как и написано выше) в общие, после компиляции значения видно не будет, а эксперт вылетит со свистом, если номер счета не совпадет.
Я все понял, что чел хотел сделать и предложил самый простой работающий вариант.
Все правильно, но только этот кусок кода нужно правильно разместить, как описал выше.
 

ansol

Местный знаток
Все правильно, но только этот кусок кода нужно правильно разместить, как описал выше.

Напоминает разговор с глухим - я же написал по-русски: это все прямо сию минут работает именно так, как написано выше с размещением в функции OnInit()
Какие проблемы-то?
 

vladradon

Программист
Напоминает разговор с глухим - я же написал по-русски: это все прямо сию минут работает именно так, как написано выше с размещением в функции OnInit()
Какие проблемы-то?
Функция OnInit() не является даже изначально командной, т.е. она фиксирует общие параметры работы сова. Единственная команда, которая может запретить работу сова - ExpertRemove() в этой функции.
 
Последнее редактирование модератором:

matro3

Почетный гражданин
_http://docs.mql4.com/ru/basis/function/events
если return(INIT_SUCCEEDED), то работа продолжится.
если return(INIT_FAILED), то нет.
Обработаете условиями и дадите нужную команду.
Чтоб не ругался компилятор делайте:
"int OnInit()" вместо "void OnInit()"
 

ansol

Местный знаток
_http://docs.mql4.com/ru/basis/function/events
если return(INIT_SUCCEEDED), то работа продолжится.
если return(INIT_FAILED), то нет.
Обработаете условиями и дадите нужную команду.
Чтоб не ругался компилятор делайте:
"int OnInit()" вместо "void OnInit()"

Ну, товарищ не панимаает!
Там еще куча кодов есть, по которым обламывается запуск сова, я выбрал
return(INIT_PARAMETERS_INCORRECT) - сов выкидывает, т.е. REMOVE делает.
И проверил, и выжимку из лога журнала экспертов привел - ну, не верит товарищ, шибка вумный, аднака :D
 

DomovenokBrest

♔♕♖♗♘♙
Всем привет! Помогите пожалуйста привязать советник к счету. Читал на 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);
}
//============================================================================
 

vlad_123

Местный знаток
Функция OnInit() не является даже изначально командной, т.е. она фиксирует общие параметры работы сова. Единственная команда, которая может запретить работу сова - ExpertRemove() в этой функции.
Т.е. вас не смущает, что в документации написано _http://docs.mql4.com/ru/basis/function/events:
Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED
 
Последнее редактирование модератором:

vladradon

Программист
Ну, товарищ не панимаает!
Там еще куча кодов есть, по которым обламывается запуск сова, я выбрал
return(INIT_PARAMETERS_INCORRECT) - сов выкидывает, т.е. REMOVE делает.
И проверил, и выжимку из лога журнала экспертов привел - ну, не верит товарищ, шибка вумный, аднака :D
Спасибо за разъяснение - теперь буду знать.;)
Просто не всегда успеваю следить за объединением языков (4 и 5), а раньше на 4-ке такого не было вроде как...
Главное - мы предложили рабочие варианты, а какой использовать, уже сам прогер выберет.
 
Последнее редактирование:

Semenov Semen

Прохожий
Пишем
PHP:
int Account=Номер_счета;
int OnInit() 
  { 
   if(Account > 0 && Account != AccountNumber())  return(INIT_PARAMETERS_INCORRECT);
}
Какие еще ошибки, если это работает в сове прямо сию минуту?
Если номер заданного вами счета и счета, на котором запущен сов не совпадает, то инициализация завершится с ошибкой и торговать сов не будет.
Ошибки были при компиляции. Сейчас разобрался,всё работает. Спасибо!
 

Dobryj

Почетный гражданин
ВСЕМ ПРИВЕТ !
ПОМОГИТЕ ПОЖАЛУЙСТА РАЗОБРАТЬСЯ
//+----------------------------------------------------------------------------+
//| Описание : Возвращает наименование торговой операции |
//| 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(); } // при данном условии трал не работает , ошибка неверный тикет
НЕ РАБОТАЕТ ТРАЛ КОГДА ОТКЛЮЧЕН БЕЗУБЫТОК И ВКЛЮЧЕН ТРАЛ,НО РАБОТАТ КОГДА ДВА УСЛОВИЯ ТРУЕ , МОЖЕТ КТО ДАСТ КУСОК КОДА ПО ТРАЛУ ПОПРОЩЕ
 
Последнее редактирование:

Mirosha

Интересующийся
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.
 

Евгений Симашов

Новичок форума
Господа программисты, а есть ли способ, чтоб любая сова начинала торговать только если разрешит уровень CCI?? как это сделать если можно самым простым способом?
------
Мне тут посоветовали примерно так:
if (cci > 100 || cci < -100)
return;
но куда это вставлять после слова START INI или еще куда? и то ли это что надо?..
 

matro3

Почетный гражданин
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.

Если индикатор рисует какие-то графические объекты, то можно их находить и смотреть свойства. Но это, наверняка, не ваш случай. Поэтому ответ - никак.
 

Gnn-life

Местный знаток
Если индикатор рисует какие-то графические объекты, то можно их находить и смотреть свойства. Но это, наверняка, не ваш случай. Поэтому ответ - никак.

а я бы так однозначно не ответила.....в программе мкл очень много возможностей
 

mobidik

-----
Подскажите пожалуйста через какую функцию можно написать советник по стандартному индикатору Volumes , но только не через буфер обмена индикатора.

В данном случае сам индикатор не нужен, воспользуйтесь ф-цией iVolume
PHP:
long  iVolume(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );
 
Верх