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

Ugar

Гуру форума
я верно понимаю, чтобы кусок кода выполнялся один раз, только при запуске советника, его надо засунуть в init()???так да?:)
есть ли функциональные ограничения этого(любого) куска кода при работе в init()???
Нет, не правильно. Функция init() и всё её содержимое выполняется не только при запуске программы. Всё есть в справочнике.
_http://docs.mql4.com/ru/runtime/start
 

mobidik

-----
Это вопрос не для профи, это вопрос, для тех, кто изучает, или только начинает изучать язык.
Всё тоже что и в старте, но один раз. Например подготовка данных которые будут использоваться в функции старт. Ну а деинит, понятно, что может отвечать за сохранение данных, после окончания работы советника, скрипта или индикатора.
Это идеологическая нагрузка.

Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: SimulateTick, график будет построен совой. Ниже привожу код скрипта, где для его запуска нужен тик.
Вопрос 1: откуда тик?
А тик есть, т.к. если отключить терминал от сети, то и скрипт не поможет. Т.е., что б отработала сова, ей нужен тик, который формирует скрипт, в свою очередь, скрипту нужно подключение к сети.
Вопрос 2: как заставить его, скрипт SimulateTick, работать без подключения к сети?

PHP:
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#include <WinUser32.mqh>
#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

int start() {
   int Li_0 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int Li_4 = WindowHandle(Symbol(), Period());
   PostMessageA(Li_4, Li_0, 2, 1);
   return (0);
}
 

_SERG_

Активный участник
Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: SimulateTick, график будет построен совой. Ниже привожу код скрипта, где для его запуска нужен тик.
Вопрос 1: откуда тик?
А тик есть, т.к. если отключить терминал от сети, то и скрипт не поможет. Т.е., что б отработала сова, ей нужен тик, который формирует скрипт, в свою очередь, скрипту нужно подключение к сети.
Вопрос 2: как заставить его, скрипт SimulateTick, работать без подключения к сети?


PHP:
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#include <WinUser32.mqh>
#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

int start() {

   int Li_0 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int Li_4 = WindowHandle(Symbol(), Period());
   PostMessageA(Li_4, Li_0, 2, 1);
   return (0);
}
Я столкнулся с "тиковой проблемой" когда надо было обработаль разные инструменты. Решил её, зацикливанием.

По поводу пояснений, по моему очевидно, что без котировок, не построиться график.

PHP:
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#include <WinUser32.mqh>
#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

int start() {
while(TRUE){
   int Li_0 =      RegisterWindowMessageA("MetaTrader4_Internal_Message");
    int Li_4 = WindowHandle(Symbol(), Period());
   PostMessageA(Li_4, Li_0, 2, 1);
   Sleep(1000);
  }
}
 

_SERG_

Активный участник
Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: SimulateTick, график будет построен совой. Ниже привожу код скрипта, где для его запуска нужен тик.
Вопрос 1: откуда тик?
А тик есть, т.к. если отключить терминал от сети, то и скрипт не поможет. Т.е., что б отработала сова, ей нужен тик, который формирует скрипт, в свою очередь, скрипту нужно подключение к сети.
Вопрос 2: как заставить его, скрипт SimulateTick, работать без подключения к сети?

PHP:
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#include <WinUser32.mqh>
#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

int start() {
   int Li_0 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int Li_4 = WindowHandle(Symbol(), Period());
   PostMessageA(Li_4, Li_0, 2, 1);
   return (0);
}

Я пользуюсь зацикленным скриптом.

#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#include <WinUser32.mqh>
#import "user32.dll"
int RegisterWindowMessageA(string a0);
#import

int start() {
while(TRUE){
int Li_0 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
int Li_4 = WindowHandle(Symbol(), Period());
PostMessageA(Li_4, Li_0, 2, 1);
Sleep(1000);
}
}

Тогда второй вопрос сам отпадает.
 

_SERG_

Активный участник
Нет, не правильно. Функция init() и всё её содержимое выполняется не только при запуске программы. Всё есть в справочнике.
_http://docs.mql4.com/ru/runtime/start

А у меня init() и deinit() выполняются один раз.
Я про скрипты советники и индикаторы.
 

qqmber

Почетный гражданин
я верно понимаю, чтобы кусок кода выполнялся один раз, только при запуске советника, его надо засунуть в init()???так да?:)
есть ли функциональные ограничения этого(любого) куска кода при работе в init()???
Для скриптов и советников я не припоминаю каких-то ограничений для кода в init().
В индикаторах при выполнении init() текущей информации может еще не быть совсем, ни аска, ни бида, ноль баров и т.п.
 

AlexeyVik

Программист mql4 mql5
Задание размера массива до его использования - это и есть забота о распределении памяти! Она не тебя беспокоит - просто беспокойство разработчики свалили на тебя, вот и все.

Программмку будем обсуждать, что я выложил или "ну ее к чертям"?
Я тебе о том и говорил и повторю. Меня вопрос распределения памяти НЕ беспокоит. 8 гигов памяти забить задачкой МТ невозможно.

Ладно, чё-то по теме все замолчали.
Хорош оффтопить про форекс!
Изучаем массивы в mql4(свое мнение про них я уже высказал).
Переходим к делу:
PHP:
//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//--- input parameters
extern int       ExtParam1=1;
//--- buffers
double ExtMapBuffer1[];
double f[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   ExtMapBuffer1[5]=2.7182;
   f[5]=2.7182;
   Comment(ExtMapBuffer1[5]," ",f[5]);
//----
   return(0);
  }
//+------------------------------------------------------------------+
Индюк создан с помощью стандартной процедуры MT4 - правой мышкой щелк на "пользовательские индикаторы" - в меню выбираем "создать"
1 внешний параметр, 1 буфер. Текст перед вами.
Результат у меня в МТ4 билд 509, скачан с оффсайта FXOpen (не реклама, просто так получилось, что я к ним в конкурс залез по приколу, он счас идет, здесь же на сайте организован)
Результат на картинке. Ну-с, не уроды?
Твоя задача решается в пол-пинка.
Код:
#property copyright "Copyright 2013, Viktorov"
#property link      "[email protected]"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkGreen

      double   _Point;

double Buff_1[];
double Buff_2[];
int init() //********Custom indicator initialization function********|
{
   IndicatorBuffers(2);
   IndicatorShortName("indTest");
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexBuffer(0, Buff_1);
   SetIndexBuffer(1, Buff_2);
   SetIndexArrow(0, 158);
   IndicatorDigits(Digits);
   _Point = Point;
   if(Digits % 2 == 1) _Point *=10;
   return(0);
}//******************************************************************|

//*******************************************************************|
//|             Custom indicator iteration function                  |
//*******************************************************************|
int start()
  {
//----IndicatorCounted()
   int i, limit = Bars - IndicatorCounted()-1;
    Buff_1[5] = 2.7182;
     Buff_2[5] = 2.7182;
    Comment("Buff_1[5] = ", Buff_1[5]
          , "\nBuff_2[5] = ", Buff_2[5]);
   return(0);
}//******************************************************************|

int deinit() //******Custom indicator deinitialization function******|
{
   return(0);
}//******************************************************************|
 

Вложения

  • 00.png
    00.png
    37,4 КБ · Просмотры: 17
Последнее редактирование:

mak_kam

Новичок форума
Здравствуйте, Уважаемые! Помогите начинающему...
Подскажите как реализовать в коде чтобы при срабатывании отложенного ордера предыдущий рыночный однонаправленный ордер с таким же магиком закрывался?
 
Последнее редактирование:

Ugar

Гуру форума
А у меня init() и deinit() выполняются один раз.
Я про скрипты советники и индикаторы.
А у меня терминал МТ4, видать у Вас какой то другой.
В МТ4:
Функций init() и deinit() нет в скриптах.
В советниках и индикаторах init() выполняется:
1. Сразу же после присоединения к графику программы
2. сразу после старта клиентского терминала
3. после смены финансового инструмента
4. после смены периода графика
5. после перекомпиляции программы в редакторе MetaEditor
6. после смены входных параметров из окна настройки эксперта или пользовательского индикатора
7. Советник также инициализируется после смены счёта
 

AlexeyVik

Программист mql4 mql5
Андрей, я встречал одного умника который вписал в deinit() некоторые вычисления и периодически из start() вызывал deinit()
Так-что ты зря удивляешься многократному выполнению функций которые у нормальных выполняются один раз.

Всё что ты перечислил это причины перезапуска программы и соответственно сначала выполняется deinit(), программа закрыта. Потом программа запускается и выполняется init() опять-же однократно.
 

Albertid11

Интересующийся
Всем здрасте, есть индюк , строит прям точные уровни по фракталам, но ужасно тормозит при смене тф или когда запихиваешь его на график, может ли кто нибудь исправить код что ли чтобы не тормозил он?
//+------------------------------------------------------------------+
//| |
//| Индикатор для автоматического построения уровней |
//| PPZ по трём фракталам |
//| _http://www.mql4.com/ru/users/Dserg |
//+------------------------------------------------------------------+
#property copyright "Dserg, 2010"
#property link "_http://www.mql4.com/ru/users/Dserg"

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DeepSkyBlue
#property indicator_color2 HotPink
#property indicator_color3 Gold
#property indicator_color4 Tomato

//---- buffers
double B0[];
double B1[];
double B2[];
double B3[];

double Fr0[1000];
int Ind0[1000];

//Ширина окна, в котором ищутся уровни
extern int timeFrame = 0;
extern int Nbars = 150;
//Смещение правого бара для окна
extern int Nfirst = 0;
//Минимальное расстояние между уровнями в пунктах
extern double minDiff = 300.0;
//Минимальное расстояние между фракталами в барах
extern int minBars = 5;

static bool calculated;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 3additional buffers are used for counting.

//---- drawing settings

SetIndexStyle(0,DRAW_ARROW,0,4);
SetIndexBuffer(0, B0);
SetIndexArrow(0, 119);
SetIndexStyle(1,DRAW_ARROW,0,4);
SetIndexBuffer(1, B1);
SetIndexArrow(1, 119);
SetIndexStyle(2,DRAW_ARROW,0,4);
SetIndexBuffer(2, B2);
SetIndexArrow(2, 119);
SetIndexStyle(3,DRAW_ARROW,0,4);
SetIndexBuffer(3, B3);
SetIndexArrow(3, 119);

SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
SetIndexEmptyValue(3,0.0);

SetIndexLabel(0,"PPZ 0");
SetIndexLabel(1,"PPZ 1");
SetIndexLabel(2,"PPZ 2");
SetIndexLabel(3,"PPZ 3");

calculated = false;
return(0);
}

int deinit()
{
ObjectDelete("PPZ");
ObjectDelete("PPZ1");
ObjectDelete("PPZ2");
ObjectDelete("PPZ3");
ObjectDelete("V1");
ObjectDelete("V2");
Comment("");
return(0);
}

int start()

{
if (calculated) return(0);
if (Nbars>500) {
Comment("Too much bars to calulate, try < 500");
return(0);
}

int counted_bars = IndicatorCounted();

if (counted_bars < 0) return(-1);
if (counted_bars >= Bars) return(0);

Comment("Calculating PPZ..");
datetime t0 = TimeLocal();

int loopbegin = Nbars+Nfirst;

int i,j,k,l,imin,jmin,kmin,lmin,imin1,jmin1,kmin1,lmin1,imin2,jmin2,kmin2,lmin2,imin3,jmin3,kmin3,lmin3;
double f0,f1,f2,f3,p0,s0,pmin,smin,pmin1,smin1,pmin2,smin2,pmin3,smin3;
int Nmax;
pmin = 10.0;
smin = 10000.0;
pmin1 = 20.0;
smin1 = 20000.0;
pmin2 = 30.0;
smin2 = 30000.0;
pmin3 = 40.0;
smin3 = 40000.0;

//Ищем фракталы, складываем в массив
j=0;
for(i = loopbegin; i > Nfirst; i--) {
f0 = -1.0;
f0 = iFractals(NULL,timeFrame,MODE_UPPER,i);
if (f0<=0.0 ) f0 = iFractals(NULL,timeFrame,MODE_LOWER,i);
if (f0>0.0) {
Fr0[j]=f0;
Ind0[j]=i;
j++;
}
}
Nmax = j;



//ищем первую линию PPZ по 4-м фракталам
for(i = 0; i < Nmax; i++) {
f0 = Fr0;
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0-Ind0[j])>minBars) {
for(k = 0; k < Nmax; k++) {
f2 = Fr0[k];
if (k!=i && k!=j && MathAbs(Ind0-Ind0[k])>minBars && MathAbs(Ind0[k]-Ind0[j])>minBars) {
for(l = 0; l < Nmax; l++) {
f3 = Fr0[l];
if ( l!=i && l!=j && l!=k && MathAbs(Ind0-Ind0[l])>minBars && MathAbs(Ind0[j]-Ind0[l])>minBars && MathAbs(Ind0[k]-Ind0[l])>minBars) {
p0 = (f0+f1+f2+f3)/4.0;
s0 = (f0-p0)*(f0-p0)+(f1-p0)*(f1-p0)+(f2-p0)*(f2-p0)+(f2-p0)*(f2-p0);
if (s0<smin) {
smin=s0;
pmin=p0;
imin=i;
jmin=j;
kmin=k;
lmin=l;
}
}
}
}
}
}
}
}

//ищем вторую линию PPZ по 4-м фракталам
for(i = 0; i < Nmax; i++) {
f0 = Fr0;
if (i!=imin && i!=jmin && i!=kmin && i!=lmin) {
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0-Ind0[j])>minBars && j!=imin && j!=jmin && j!=kmin && j!=lmin) {
for(k = 0; k < Nmax; k++) {
f2 = Fr0[k];
if (k!=i && k!=j && MathAbs(Ind0-Ind0[k])>minBars && MathAbs(Ind0[k]-Ind0[j])>minBars && k!=imin && k!=jmin && k!=kmin && k!=lmin) {
for(l = 0; l < Nmax; l++) {
f3 = Fr0[l];
if ( l!=i && l!=j && l!=k && MathAbs(Ind0-Ind0[l])>minBars && MathAbs(Ind0[j]-Ind0[l])>minBars && MathAbs(Ind0[k]-Ind0[l])>minBars && l!=imin && l!=jmin && l!=kmin && l!=lmin) {
p0 = (f0+f1+f2+f3)/4.0;
s0 = (f0-p0)*(f0-p0)+(f1-p0)*(f1-p0)+(f2-p0)*(f2-p0)+(f2-p0)*(f2-p0);
if (s0<smin1 && MathAbs(p0-pmin)>minDiff*Point) {
smin1=s0;
pmin1=p0;
imin1=i;
jmin1=j;
kmin1=k;
lmin1=l;
}
}
}
}
}
}
}
}
}

//ищем третью линию PPZ по 4-м фракталам
for(i = 0; i < Nmax; i++) {
f0 = Fr0;
if (i!=imin && i!=jmin && i!=kmin && i!=lmin && i!=imin1 && i!=jmin1 && i!=kmin1 && i!=lmin1) {
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0-Ind0[j])>minBars && j!=imin && j!=jmin && j!=kmin && j!=lmin && j!=imin1 && j!=jmin1 && j!=kmin1 && j!=lmin1) {
for(k = 0; k < Nmax; k++) {
f2 = Fr0[k];
if (k!=i && k!=j && MathAbs(Ind0-Ind0[k])>minBars && MathAbs(Ind0[k]-Ind0[j])>minBars && k!=imin && k!=jmin && k!=kmin && k!=lmin && k!=imin1 && k!=jmin1 && k!=kmin1 && k!=lmin1) {
for(l = 0; l < Nmax; l++) {
f3 = Fr0[l];
if ( l!=i && l!=j && l!=k && MathAbs(Ind0-Ind0[l])>minBars && MathAbs(Ind0[j]-Ind0[l])>minBars && MathAbs(Ind0[k]-Ind0[l])>minBars && l!=imin && l!=jmin && l!=kmin && l!=lmin && l!=imin1 && l!=jmin1 && l!=kmin1 && l!=lmin1) {
p0 = (f0+f1+f2+f3)/4.0;
s0 = (f0-p0)*(f0-p0)+(f1-p0)*(f1-p0)+(f2-p0)*(f2-p0)+(f2-p0)*(f2-p0);
if (s0<smin2 && MathAbs(p0-pmin)>minDiff*Point && MathAbs(p0-pmin1)>minDiff*Point) {
smin2=s0;
pmin2=p0;
imin2=i;
jmin2=j;
kmin2=k;
lmin2=l;
}
}
}
}
}
}
}
}
}

//ищем четвёртую линию PPZ по 4-м фракталам
for(i = 0; i < Nmax; i++) {
f0 = Fr0;
if (i!=imin && i!=jmin && i!=kmin && i!=lmin && i!=imin1 && i!=jmin1 && i!=kmin1 && i!=lmin1 && i!=imin2 && i!=jmin2 && i!=kmin2 && i!=lmin2) {
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0-Ind0[j])>minBars && j!=imin && j!=jmin && j!=kmin && j!=lmin && j!=imin1 && j!=jmin1 && j!=kmin1 && j!=lmin1 && j!=imin2 && j!=jmin2 && j!=kmin2 && j!=lmin2) {
for(k = 0; k < Nmax; k++) {
f2 = Fr0[k];
if (k!=i && k!=j && MathAbs(Ind0-Ind0[k])>minBars && MathAbs(Ind0[k]-Ind0[j])>minBars && k!=imin && k!=jmin && k!=kmin && k!=lmin && k!=imin1 && k!=jmin1 && k!=kmin1 && k!=lmin1 && k!=imin2 && k!=jmin2 && k!=kmin2 && k!=lmin2) {
for(l = 0; l < Nmax; l++) {
f3 = Fr0[l];
if ( l!=i && l!=j && l!=k && MathAbs(Ind0-Ind0[l])>minBars && MathAbs(Ind0[j]-Ind0[l])>minBars && MathAbs(Ind0[k]-Ind0[l])>minBars && l!=imin && l!=jmin && l!=kmin && l!=lmin && l!=imin1 && l!=jmin1 && l!=kmin1 && l!=lmin1 && l!=imin2 && l!=jmin2 && l!=kmin2 && l!=lmin2) {
p0 = (f0+f1+f2+f3)/4.0;
s0 = (f0-p0)*(f0-p0)+(f1-p0)*(f1-p0)+(f2-p0)*(f2-p0)+(f2-p0)*(f2-p0);
if (s0<smin3 && MathAbs(p0-pmin)>minDiff*Point && MathAbs(p0-pmin1)>minDiff*Point && MathAbs(p0-pmin2)>minDiff*Point) {
smin3=s0;
pmin3=p0;
imin3=i;
jmin3=j;
kmin3=k;
lmin3=l;
}
}
}
}
}
}
}
}
}

//Рисуем результаты, отмечаем точки
B0[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin]))];
B0[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin]))];
B0[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin]))];
B0[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin]))];

B1[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin1]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin1]))];
B1[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin1]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin1]))];
B1[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin1]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin1]))];
B1[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin1]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin1]))];

B2[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin2]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin2]))];
B2[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin2]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin2]))];
B2[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin2]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin2]))];
B2[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin2]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin2]))];

B3[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin3]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[imin3]))];
B3[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin3]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[jmin3]))];
B3[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin3]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[kmin3]))];
B3[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin3]))] = Open[iBarShift(NULL,0,iTime(NULL,timeFrame,Ind0[lmin3]))];

if(!ObjectCreate("PPZ",OBJ_HLINE,0,Time[0],NormalizeDouble(pmin,Digits))) {
Comment("ERROR");
return(0);
}
if(!ObjectCreate("PPZ1",OBJ_HLINE,0,Time[0],NormalizeDouble(pmin1,Digits))) {
Comment("ERROR");
return(0);
}
if(!ObjectCreate("PPZ2",OBJ_HLINE,0,Time[0],NormalizeDouble(pmin2,Digits))) {
Comment("ERROR");
return(0);
}
if(!ObjectCreate("PPZ3",OBJ_HLINE,0,Time[0],NormalizeDouble(pmin3,Digits))) {
Comment("ERROR");
return(0);
}

if(!ObjectCreate("V1",OBJ_VLINE,0,iTime(NULL,timeFrame,Nbars+Nfirst),Open[0])) {
Comment("ERROR");
return(0);
}
if(!ObjectCreate("V2",OBJ_VLINE,0,iTime(NULL,timeFrame,Nfirst),Open[0])) {
Comment("ERROR");
return(0);
}
ObjectSet("PPZ",OBJPROP_COLOR,DeepSkyBlue);
ObjectSet("PPZ",OBJPROP_STYLE,STYLE_DASH);

ObjectSet("PPZ1",OBJPROP_COLOR,DeepPink);
ObjectSet("PPZ1",OBJPROP_STYLE,STYLE_DASH);

ObjectSet("PPZ2",OBJPROP_COLOR,Gold);
ObjectSet("PPZ2",OBJPROP_STYLE,STYLE_DASH);

ObjectSet("PPZ3",OBJPROP_COLOR,Tomato);
ObjectSet("PPZ3",OBJPROP_STYLE,STYLE_DASH);

ObjectSet("V1",OBJPROP_COLOR,DarkKhaki);
ObjectSet("V2",OBJPROP_COLOR,DarkKhaki);

calculated = true;
datetime t1 = TimeLocal()-t0;
Comment("Calculation of PPZ done \n PPZ0 " + DoubleToStr(pmin,5) + "\n PPZ1 " + DoubleToStr(pmin1,5) + "\n PPZ2 " + DoubleToStr(pmin2,5) + "\n PPZ3 " + DoubleToStr(pmin3,5) + "\n Time " + t1 + " sec.");
return(0);
}
//+------------------------------------------------------------------+




блин буду благодарен, индюк стоящий, всем советую! ;)
 
Последнее редактирование модератором:

Ugar

Гуру форума
Андрей, я встречал одного умника который вписал в deinit() некоторые вычисления и периодически из start() вызывал deinit()
Так-что ты зря удивляешься многократному выполнению функций которые у нормальных выполняются один раз.

Всё что ты перечислил это причины перезапуска программы и соответственно сначала выполняется deinit(), программа закрыта. Потом программа запускается и выполняется init() опять-же однократно.
Я то как раз не удивляюсь. Просто это надо учитывать. Например, что пользователь может переключить период графика. Советник при этом должен нормально работать.

У меня есть один не торгующий советник. Так в нём весь код зациклен внутри init().
A внутри start() только одна функция.

start()
{
init();
}
 

AlexeyVik

Программист mql4 mql5
Мне важно наличие самого объекта на графике, иначе я не знаю как работать в советнике с "воображаемой" линией.
На самом деле работать с воображаемой линией легко.
Берёшь координаты первой точки номер бара и цена, потом координаты второй точки, опять-же номер бара и цена.
Из этих координат получаешь катеты прямоугольного треугольника в шт.
№бара 1й точки минус №бара второй точки это длина горизонтального катета (А).
Цена во второй точке минус цена в первой точке, разницу разделить на Point это высота треугольника (В).
Потом вспомнить что такое тангенс (tan = В:А) и вычислив его поставить в формулу В1 = (А+n)*tan получаешь количество пунктов от цены в первой точке до точки на линии в определённое время (бар А+n).
Надеюсь дальше сам сообразишь.
 

mak_kam

Новичок форума
Здравствуйте, Уважаемые! Помогите начинающему...
Подскажите как реализовать в коде чтобы при срабатывании отложенного ордера предыдущий рыночный однонаправленный ордер с таким же магиком закрывался?

Уважаемые подскажите хотя бы где копать пожалуйста! :please::facepalm:
 

_SERG_

Активный участник
А у меня терминал МТ4, видать у Вас какой то другой.
В МТ4:
Функций init() и deinit() нет в скриптах.
В советниках и индикаторах init() выполняется:
1. Сразу же после присоединения к графику программы
2. сразу после старта клиентского терминала
3. после смены финансового инструмента
4. после смены периода графика
5. после перекомпиляции программы в редакторе MetaEditor
6. после смены входных параметров из окна настройки эксперта или пользовательского индикатора
7. Советник также инициализируется после смены счёта

Всё по честному, терминал МТ4 билд 509.
По поводу "Функций init() и deinit() нет в скриптах. ", если они не возникают в шаблоне при его открытии в метаэдиторе, допишите из руками, а дальше всё как обычно с этими функциями. :D
Понятно, что правила вызова функций распространяются и на т.н. "стандартные" функции, но даже при неоднократном вызове, как INIT() так и DEINIT() каждая из этих функций выполниться один раз при запуске и останове софта.
Просто с точки зрения организации кода проще использовать их по назначению.
 
Последнее редактирование:

asers1111

Активный участник
Добрый день уважаемые мастера.Прежде всего СПАСИБО вам за всю предидущую помощь.Помогите,пожалуйста, с функцией.Есть у меня функция,которая позволяет определить,когда и какой был открыт предидущий ордер.
// функция возвращает true если отдер открыт менее bar баров, и false если более bar боров или ордера нет
// пример вызова OrderInBars( OP_BUY, 70, Magic )

bool OrderInBars( int order_type, int bar, int magic ) {
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
if( iBarShift(NULL, timeframe, OrderOpenTime()) > bar )
return(false);

return(true);
}

return(false);
}

Я же хочу ,чтобы можно было найти и определить,сколько баров до предидущего СИГНАЛА индикатора.(Не важно открывался ордер по нему или нет и неважно Buy или Sell.)Вот функция определяющая сам сигнал индикатора:

//если на индиаторе StepMA_v9 сменился цвет - это сигнал, функция возвращает true
bool SIGNAL( int bar = 1 )
{
double V9Blue = iCustom(Symbol(),0,"StepMA_v9",TimeFrame,Pricce,Length,StepSize,Multiplier,MinStep,Displace,ColorMode,StepMAMode,alerts,AlertMode,SoundsNumber,SoundsPause,UpSound,DnSound,EmailMode,EmailsNumber,1,bar);
double V9Blue1 = iCustom(Symbol(),0,"StepMA_v9",TimeFrame,Pricce,Length,StepSize,Multiplier,MinStep,Displace,ColorMode,StepMAMode,alerts,AlertMode,SoundsNumber,SoundsPause,UpSound,DnSound,EmailMode,EmailsNumber,1,bar+2);

if(V9Blue != EMPTY_VALUE && V9Blue1 == EMPTY_VALUE || V9Blue == EMPTY_VALUE && V9Blue1 != EMPTY_VALUE)return(true);
return(false);
}

Помогите,пожалуйста мне с функцией ,которая позволит определить сколько баров до ПРЕДИДУЩЕГО СИГНАЛА(Не важно Buy или Sell).
 

Вложения

  • Рисунок с графика.JPG
    Рисунок с графика.JPG
    235,2 КБ · Просмотры: 22

Ugar

Гуру форума
Всё по честному, терминал МТ4 билд 509.
По поводу "Функций init() и deinit() нет в скриптах. ", если они не возникают в шаблоне при его открытии в метаэдиторе, допишите из руками, а дальше всё как обычно с этими функциями. :D
Возможно. Хотя, не вижу особой надобности init() и deinit() в скрипте.
Понятно, что правила вызова функций распространяются и на т.н. "стандартные" функции, но даже при неоднократном вызове, как INIT() так и DEINIT() каждая из этих функций выполниться один раз при запуске и останове софта.
Просто с точки зрения организации кода проще использовать их по назначению.
Вот в таком коде, инициализация выполняется на каждом тике, а не только при запуске программы.
Вызов функции init() неоднократный и выполняется при каждом вызове.
int a;
int init()
{
a++;
Comment(a);
return(0);
}
int start()
{
init();
return(0);
}
Кроме того, как я привёл пример раньше. Сидит трейдер и щёлкает периоды графика каждые 5 секунд. Это переинициализирует советник и индикаторы. Если при написании программы не будет учтено такое поведение трейдера, то может привести к неправильной работе.
Я понял о чём речь. Спор не по существу, а по терминологии. Не стоит он продолжения.
 
Последнее редактирование:

ansol

Местный знаток
На самом деле работать с воображаемой линией легко.
Берёшь координаты первой точки номер бара и цена, потом координаты второй точки, опять-же номер бара и цена.
Из этих координат получаешь катеты прямоугольного треугольника в шт.
№бара 1й точки минус №бара второй точки это длина горизонтального катета (А).
Цена во второй точке минус цена в первой точке, разницу разделить на Point это высота треугольника (В).
Потом вспомнить что такое тангенс (tan = В:А) и вычислив его поставить в формулу В1 = (А+n)*tan получаешь количество пунктов от цены в первой точке до точки на линии в определённое время (бар А+n).
Надеюсь дальше сам сообразишь.

Зачем такие сложности, когда есть встроенный иснтрумент? Для контроля сначала все равно придется рисовать, потом-то, конечно, необязательно, хотя лучше бы видеть, что должно произойти. Глянул и уже прикидываешь, как поступит советник, может, ему помочь надо? :)
 

AlexeyVik

Программист mql4 mql5
Зачем такие сложности, когда есть встроенный иснтрумент? Для контроля сначала все равно придется рисовать, потом-то, конечно, необязательно, хотя лучше бы видеть, что должно произойти. Глянул и уже прикидываешь, как поступит советник, может, ему помочь надо? :)
Встроенный инструмент невероятно тормозит работу в тестере. Да и не так уж это сложно. Не сложней построения объекта.
Да к тому-же это ответ на твой вопрос.
 
Последнее редактирование:

_SERG_

Активный участник
Возможно. Хотя, не вижу особой надобности init() и deinit() в скрипте.

Вот в таком коде, инициализация выполняется на каждом тике, а не только при запуске программы.
Вызов функции init() неоднократный и выполняется при каждом вызове.
int a;
int init()
{
a++;
Comment(a);
return(0);
}
int start()
{
init();
return(0);
}
Кроме того, как я привёл пример раньше. Сидит трейдер и щёлкает периоды графика каждые 5 секунд. Это переинициализирует советник и индикаторы. Если при написании программы не будет учтено такое поведение трейдера, то может привести к неправильной работе.
Я понял о чём речь. Спор не по существу, а по терминологии. Не стоит он продолжения.

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

По поводу общей работы советника и трэйдера, на одном графике, полностью согласен.
Такая схема напрягает и постоянно требуется пересчёта текущей ситуации.
Думаю что если уже сова на графике, то не надо туда лезть руками, иначе это пожизненно.
По вопросу "... вижу особой надобности init() и deinit() в скрипте.
" скажу, что при обработке тех же ордеров, в ините() подготавливаю данные для совы, в старте() с ними оперирую, в деините сохраняю, если трэёдер сделал, чего то, что вызывает "сброс" наработанных кодом данных, а потом в ините() при переинициализации совы с новыми параметрами, перечитываю и восстанавливаю их. Зачем? Чтобы было с чем сравнивать, ведб сова стоит не один день, а бары это форма представления цены, и по барам не всегда можно найти её значение, или другие нюансы, возникающие при торговле совой/скриптом.
Да и ещё, если обрабатывать 27 инструментов, кроме как в зацикленный скрипт, логику никуда больше не засунешь.
Не, можно копии размазать, не вопрос. :D
 
Последнее редактирование:
Верх