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

eevviill

Заблокирован
Нет, не лучше так, так это тот же ... только вид сбоку ))) а вопрос как был так и остался: результат обновляется только при появлении нового бара а хотелось бы видеть и фиксировать изменения на каждом тике.
- У меня не заводится машина.
- Хорошо. Мне нужно вглянуть что с ней. Откройте капот.
- Не. Не открою. Вы так скажите почему она не заводится.
 

tommy27

Гуру форума
Опа, а если всё откинуть то работает:oops:
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                        Delta.mq4 |
//|                                                          tommy27 |
//|                                                  [email protected] |
//+------------------------------------------------------------------+
#property copyright "tommy27"
#property link      "[email protected]"

double 
       StartPrice1,
       Delta1,
       Price00;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Price00 = 5000;
StartPrice1 =  iClose(0,0,0);
//StartPrice1 = Close[0];
Delta1 = MathAbs (Price00 - StartPrice1);
//if (Delta1>1000) Delta1=0;
Comment (Delta1);
Print ("Raznica= ",Delta1);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Буду разбираться в основном коде, всем спасибо!
 

Ugar

Гуру форума
double StartPrice1, Delta1, Price00; ... Price00 = 5000; Не хило!!! Что это?
StartPrice1 = iClose(0,0,0); А это ещё что? Тогда уж iClose(NULL,0,0) И вообще, если использовать текущий таймфрейм и символ, то iClose использовать нет смысла.
//StartPrice1 = Close[0]; Так проще.
Delta1 = MathAbs (Price00 - StartPrice1);
//if (Delta1>1000) Delta1=0;
Comment (Delta1); Так не будет отображено всё значение
Print ("Raznica= ",Delta1); Так не будет отображено всё значение

Я потому и спращивал весь код. Что не понятно что нацарапано.
Попробуй вот так:
Код:
Expand Collapse Copy
   double 
       StartPrice1,
       Delta1,
       Price00;
Price00 = 5000;
//StartPrice1 =  iClose(0,0,0);
StartPrice1 = Close[0];
Delta1 = MathAbs (Price00 - StartPrice1);
//if (Delta1>1000) Delta1=0;
Comment (DoubleToStr(Delta1,Digits));
Print ("Raznica= ",DoubleToStr(Delta1,Digits));
У меня результат как и ожидался.
razni.JPG
 

Чико

Почетный гражданин
...
Price00 = 5000;
StartPrice1 = iClose(0,0,0);
//StartPrice1 = Close[0];
Delta1 = MathAbs (Price00 - StartPrice1);

Price00 = 5000 и StartPrice1 = iClose(0,0,0)-величины постоянные,пока новый бар не придёт (Close [n] меняется только с появлением нового бара)-откуда здесь может быть реакция на каждый тик?По-моему правильно сказали про Bid (можно Ask)..

Хм...проверил сейчас в индюке (загнал через Алерт)-действительно показания меняются..))Век живи-век учись,как говорится...))
 
Последнее редактирование:

tommy27

Гуру форума
Спасибо, всё считает и так и эдак, у меня проблема была в этом:
PapaYozh:
если советник не зацикленный, то результат будет меняться на каждом тике
Мож кому и это решение проблемы пригодится.
 

Ugar

Гуру форума
Price00 = 5000 и StartPrice1 = iClose(0,0,0)-величины постоянные,пока новый бар не придёт (Close [n] меняется только с появлением нового бара)-откуда здесь может быть реакция на каждый тик?По-моему правильно сказали про Bid (можно Ask)..
Ещё раз повторю. Close[0] это Bid; Обновляется с каждым тиком.
iClose(NULL,0,0) то же =Bid, и то же обновляется с каждым тиком.
 

Чико

Почетный гражданин
Ещё раз повторю. Close[0] это Bid; Обновляется с каждым тиком.
iClose(NULL,0,0) то же =Bid, и то же обновляется с каждым тиком.

Понял-спасибо..))А чем for предпочтительнее while?Просто несколько слов без примеров..
 
Последнее редактирование:

tommy27

Гуру форума
- У меня не заводится машина.
- Хорошо. Мне нужно вглянуть что с ней. Откройте капот.
- Не. Не открою. Вы так скажите почему она не заводится.

Нее опять не так, скорее так:
-У меня какой то хруст в стартере при запуске двигателя.
- Хорошо. Мне нужно вглянуть . Откройте капот.
- Не. Не открою. Вот вам стартер, я его снял, проверьте его.
:-)
 

Ugar

Гуру форума
Понял-спасибо..))А чем for предпочтительнее while?Просто несколько слов без примеров..
Тем что в for сразу заложены пределы цикла. А в while ничего не предусмотрено. Если не предусмотреть или предусмотреть но не учесть все нюансы легко попасть в вечный цикл (зацикливание). Мрачная штука.
 

Ugar

Гуру форума
Нее опять не так, скорее так:
-У меня какой то хруст в стартере при запуске двигателя.
- Хорошо. Мне нужно вглянуть . Откройте капот.
- Не. Не открою. Вот вам стартер, я его снял, проверьте его.
:-)
Да, только проблема оказалась в шестерне на движке к которой цепляется шестерня стартера. :rolf:
 

tommy27

Гуру форума
Эт точно!
Но зато теперь досконально известно устройство стартера и взаимозаменяймость деталей в него входящих :-).
 

vetallic

Местный знаток
всем привет, мож кто подскажет пример переноса элементарного сравнения а+в в длл? спб...
или вобще инфы по переносу кода в длл... :)
 

Ugar

Гуру форума
всем привет, мож кто подскажет пример переноса элементарного сравнения а+в в длл? спб...
или вобще инфы по переносу кода в длл... :)
Код в dll не переносят. Это библиотека функций, написанная на другом языке, например на C++.
 

eevviill

Заблокирован
Ugar нужна твоя помощь с моим советником. После добавления мною пользовательских функций, перестал коректно работать Фреш сигнал. Это функция отвечающая за то чтобы не открывался сразу новый ордер при закрытии ордера и если есть условие для входа.

PHP:
Expand Collapse Copy
...
 if(_eur && _usd)
  {
  string symb = "EURUSD";
  int COR = coralCL(symb); 
  double atr = ATR(symb);
 
  int DaHL = Daily_High_Low(symb);
  int ML = Max_lenth(symb);
  int DfMA = Distance_from_MA(symb);
   
 int  spread = MarketInfo(symb,MODE_SPREAD);
 double MA = iMA( symb, TFMA, periodMA, ma_shift, ma_method, applied_price, 0);
 print = print+"\n "+symb+"    |AVG(min"+Enter+")="+DoubleToStr(AVG_eur-AVG_usd,0)+"    |ATR(min"+ATRLevel+")="+DoubleToStr(atr,0)+"    |Price-MA(min"+Min_Distance_from_MA+" (if Down+"+spread+"))="+DoubleToStr((iClose(symb,0,0)-MA)*10000,0)
 +"    |CandleLenth(max"+Max_lenth_of_Candle+")="+DoubleToStr((iHigh(symb,0,0)-iLow(symb,0,0))*10000,0)+"    |DailyHighLow(min"+Min_D_High_Low+")="+DoubleToStr((iHigh(symb,PERIOD_D1,0)-iLow(symb,PERIOD_D1,0))*10000,0);
    countOpenPosition(symb, MAGIC);
  
   if(GO && (atr>=ATRLevel || !UseATR) && CheckAVGfresh(1, AVG_eur, AVG_usd))
    {
     if((AVG_eur-AVG_usd)>=Enter && DaHL>0 && ML>0 && DfMA>0 && buy==0)
      Buy(symb, Lot, SL, TP, symb+Comment_, slip, MAGIC, MaxAttempts, Blue);
     if((AVG_usd-AVG_eur)>=Enter && DaHL>0 && ML>0 && DfMA<0 && sell==0)
      Sell(symb, Lot, SL, TP, symb+Comment_, slip, MAGIC, MaxAttempts, Red);
    }
   if((UseMAexit && COR<0) && buy>0) CloseAll(symb, OP_BUY, MAGIC);
   if((UseMAexit && COR>0) && sell>0) CloseAll(symb, OP_SELL, MAGIC);
  }
...

bool CheckAVGfresh(int i, double AVG_1, double AVG_2)
{
 if(!UseFreshSignal) return(true);
 if(avg_[i] == 0 && ((AVG_1-AVG_2)>=Enter && buy==0)) {avg_[i] = MathAbs(AVG_1 - AVG_2); return(true);}
 if(avg_[i] == 0 && ((AVG_2-AVG_1)>=Enter && sell==0)) {avg_[i] = MathAbs(AVG_1 - AVG_2); return(true);}
 if(avg_[i] > 0 && (AVG_1-AVG_2)>0 && (AVG_1-AVG_2)<(Enter-freshlevel) && buy==0) {avg_[i] = 0; return(true);}
 if(avg_[i] > 0 && (AVG_2-AVG_1)>0 && (AVG_2-AVG_1)<(Enter-freshlevel) && sell==0) {avg_[i] = 0; return(true);}
// if(avg_[i] == 0) return(true);
 return(false);
}
 
///////////////////////////////////////////////////////////////////////////////////////////////

double ATR(string symb)
{
 if(!UseATR) return(0);
 
   int li_8;
   double ld_ret_0 = 0;
      if (StringFind(symb, "JPY", 0) != -1) li_8 = 100;
      else li_8 = 10000;
      ld_ret_0 = MathCeil(li_8 * 3 * iATR(symb, TFATR, ATRPeriod, 0));
   return (ld_ret_0);
// return(iATR(symb, TFATR, ATRPeriod, 1));
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+coralCL
int coralCL(string symb)
{
 if(!UseMAexit) return(0);
 double cor1 = iMA( symb, TFMA, periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = MarketInfo(symb,MODE_SPREAD);
 double point = MarketInfo(symb,MODE_POINT);
 
 if(iClose(symb,0,0)+spread*point<cor1) return(-1);
 if(iClose(symb,0,0)>cor1) return (1);
 
 
 
 return(0);
}
 //////////////////////////////////////////////////////////////////
int Daily_High_Low(string symb)
{
double point = MarketInfo(symb,MODE_POINT);
if(MarketInfo(symb, MODE_DIGITS) == 3 || MarketInfo(symb, MODE_DIGITS) == 5)
point = MarketInfo(symb, MODE_POINT)*10;
if (iHigh(symb,PERIOD_D1,0)-iLow(symb,PERIOD_D1,0)>=Min_D_High_Low*point) return(1);
return(0);
}
/////////////////////////////////////////////////////////////////////
int Daily_High_Low_JPY(string symb)
{
double point = MarketInfo(symb,MODE_POINT);
if(MarketInfo(symb, MODE_DIGITS) == 3 || MarketInfo(symb, MODE_DIGITS) == 5)
point = MarketInfo(symb, MODE_POINT)*10;
if (iHigh(symb,PERIOD_D1,0)-iLow(symb,PERIOD_D1,0)>=Min_D_High_Low_JPY*point) return(1);
return(0);
}
/////////////////////////////////////////////////////////////////////
int Max_lenth(string symb)
{
double point = MarketInfo(symb,MODE_POINT);
if(MarketInfo(symb, MODE_DIGITS) == 3 || MarketInfo(symb, MODE_DIGITS) == 5)
point = MarketInfo(symb, MODE_POINT)*10;
if (iHigh(symb,0,0)-iLow(symb,0,0)<=Max_lenth_of_Candle*point) return(1);
return(0);
}
/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symb)
{
 double MA = iMA( symb, TFMA, periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = MarketInfo(symb,MODE_SPREAD);
 double point = MarketInfo(symb,MODE_POINT);
if(MarketInfo(symb, MODE_DIGITS) == 3 || MarketInfo(symb, MODE_DIGITS) == 5)
point = MarketInfo(symb, MODE_POINT)*10;
 
 if(iClose(symb,0,0)+(spread*point)+(Min_Distance_from_MA*point)<=MA) return(-1);
 if(iClose(symb,0,0)-(Min_Distance_from_MA*point)>=MA) return (1);
 
 
 return(0);
}
 

реношник

Почетный гражданин
всем привет, мож кто подскажет пример переноса элементарного сравнения а+в в длл? спб...
или вобще инфы по переносу кода в длл... :)

В принципе было всё правильно сказано...

Код в dll не переносят. Это библиотека функций, написанная на другом языке, например на C++.

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

Проще всего вам посмотреть уроки здесь _http://www.fx4u.ru/topic/584-%D0%BA%D1%83%D1%80%D1%81-mql4/page__st__20 начиная с урока №23.

Насколько я могу догадываться, то все эти заморочки с ДЛЛ вам нужны для защиты. Тогда более конкретный пример будет здесь.
 
Последнее редактирование модератором:

Ugar

Гуру форума
Ugar нужна твоя помощь с моим советником. После добавления мною пользовательских функций, перестал коректно работать Фреш сигнал. Это функция отвечающая за то чтобы не открывался сразу новый ордер при закрытии ордера и если есть условие для входа.
Если проблема в пользовательской функции, может стоит её убрать и выполнить код попроще. Писать функции ради функций, это дурь или попытка запутать взломщика.
Я уже писал что разбирать чужие косяки дело не благодарное.
 

vetallic

Местный знаток
Насколько я могу догадываться, то все эти заморочки с ДЛЛ вам нужны для защиты...
ага, я не говорю что все, хотяб сравнения мелкме тех анализа или еще чет... так-как привязка по коду и времени неподхрдит
спасиб гляну щас... :-)
 
Верх