Ответить
21.01.2014, 21:18
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
я верно понимаю, чтобы кусок кода выполнялся один раз, только при запуске советника, его надо засунуть в init()???так да?
есть ли функциональные ограничения этого(любого) куска кода при работе в init()???
Нет, не правильно. Функция init() и всё её содержимое выполняется не только при запуске программы. Всё есть в справочнике.
_http://docs.mql4.com/ru/runtime/start
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Milord 
21.01.2014, 21:42
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,777
Поблагодарили 9,207 раз(а) / Репутация: 9212
Это вопрос не для профи, это вопрос, для тех, кто изучает, или только начинает изучать язык.
Всё тоже что и в старте, но один раз. Например подготовка данных которые будут использоваться в функции старт. Ну а деинит, понятно, что может отвечать за сохранение данных, после окончания работы советника, скрипта или индикатора.
Это идеологическая нагрузка.
Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: 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_4Li_021);
   return (
0);

21.01.2014, 22:01
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: 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_4Li_021);
   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_4Li_021);
   
Sleep(1000);
  }

21.01.2014, 22:02
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Вот я, как раз из тех, кто только изучает.

Тогда проясните такую ситуацию: график ренко не построится советником в выходной день, это знают все, т.к. нет тиков, типа того ):, если накинуть на график скрипт, например: 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_4Li_021);
   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_Messa ge");
int Li_4 = WindowHandle(Symbol(), Period());
PostMessageA(Li_4, Li_0, 2, 1);
Sleep(1000);
}
}

Тогда второй вопрос сам отпадает.
21.01.2014, 22:06
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Нет, не правильно. Функция init() и всё её содержимое выполняется не только при запуске программы. Всё есть в справочнике.
_http://docs.mql4.com/ru/runtime/start
А у меня init() и deinit() выполняются один раз.
Я про скрипты советники и индикаторы.
22.01.2014, 05:27
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
я верно понимаю, чтобы кусок кода выполнялся один раз, только при запуске советника, его надо засунуть в init()???так да?
есть ли функциональные ограничения этого(любого) куска кода при работе в init()???
Для скриптов и советников я не припоминаю каких-то ограничений для кода в init().
В индикаторах при выполнении init() текущей информации может еще не быть совсем, ни аска, ни бида, ноль баров и т.п.
Milord 
22.01.2014, 06:17
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Задание размера массива до его использования - это и есть забота о распределении памяти! Она не тебя беспокоит - просто беспокойство разработчики свалили на тебя, вот и все.

Программмку будем обсуждать, что я выложил или "ну ее к чертям"?
Я тебе о том и говорил и повторю. Меня вопрос распределения памяти НЕ беспокоит. 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      "v4forex@qip.ru"

#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);
}//******************************************************************|
[свернуть]

Последний раз редактировалось AlexeyVik; 22.01.2014 в 06:29.
22.01.2014, 06:47
Аватар для mak_kam
mak_kam mak_kam вне форума Новичок форума
Регистрация: 03.02.2013 / Сообщений: 21
Поблагодарили 15 раз(а) / Репутация: 16
Здравствуйте, Уважаемые! Помогите начинающему...
Подскажите как реализовать в коде чтобы при срабатывании отложенного ордера предыдущий рыночный однонаправленный ордер с таким же магиком закрывался?

Последний раз редактировалось mak_kam; 22.01.2014 в 06:55.
22.01.2014, 07:13
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
А у меня init() и deinit() выполняются один раз.
Я про скрипты советники и индикаторы.
А у меня терминал МТ4, видать у Вас какой то другой.
В МТ4:
Функций init() и deinit() нет в скриптах.
В советниках и индикаторах init() выполняется:
1. Сразу же после присоединения к графику программы
2. сразу после старта клиентского терминала
3. после смены финансового инструмента
4. после смены периода графика
5. после перекомпиляции программы в редакторе MetaEditor
6. после смены входных параметров из окна настройки эксперта или пользовательского индикатора
7. Советник также инициализируется после смены счёта
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Milord 
22.01.2014, 07:27
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Андрей, я встречал одного умника который вписал в deinit() некоторые вычисления и периодически из start() вызывал deinit()
Так-что ты зря удивляешься многократному выполнению функций которые у нормальных выполняются один раз.

Всё что ты перечислил это причины перезапуска программы и соответственно сначала выполняется deinit(), программа закрыта. Потом программа запускается и выполняется init() опять-же однократно.
Milord 
22.01.2014, 07:35
Аватар для Albertid11
Albertid11 Albertid11 вне форума Интересующийся
Регистрация: 23.01.2013 / Сообщений: 17
Поблагодарили 2 раз(а) / Репутация: 3
Всем здрасте, есть индюк , строит прям точные уровни по фракталам, но ужасно тормозит при смене тф или когда запихиваешь его на график, может ли кто нибудь исправить код что ли чтобы не тормозил он?

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

//+------------------------------------------------------------------+
//| |
//| Индикатор для автоматического построения уровней |
//| 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[i];
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0[i]-Ind0[j])>minBars) {
for(k = 0; k < Nmax; k++) {
f2 = Fr0[k];
if (k!=i && k!=j && MathAbs(Ind0[i]-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[i]-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[i];
if (i!=imin && i!=jmin && i!=kmin && i!=lmin) {
for(j = 0; j < Nmax; j++) {
f1=Fr0[j];
if (i!=j && MathAbs(Ind0[i]-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[i]-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[i]-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[i];
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[i]-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[i]-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[i]-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[i];
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[i]-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[i]-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[i]-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);
}
//+------------------------------------------------------------------+

[свернуть]



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

Последний раз редактировалось chocolate; 22.01.2014 в 09:20.
22.01.2014, 07:41
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
Андрей, я встречал одного умника который вписал в deinit() некоторые вычисления и периодически из start() вызывал deinit()
Так-что ты зря удивляешься многократному выполнению функций которые у нормальных выполняются один раз.

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

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

start()
{
init();
}
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
22.01.2014, 08:50
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Мне важно наличие самого объекта на графике, иначе я не знаю как работать в советнике с "воображаемой" линией.
На самом деле работать с воображаемой линией легко.
Берёшь координаты первой точки номер бара и цена, потом координаты второй точки, опять-же номер бара и цена.
Из этих координат получаешь катеты прямоугольного треугольника в шт.
№бара 1й точки минус №бара второй точки это длина горизонтального катета (А).
Цена во второй точке минус цена в первой точке, разницу разделить на Point это высота треугольника (В).
Потом вспомнить что такое тангенс (tan = В:А) и вычислив его поставить в формулу В1 = (А+n)*tan получаешь количество пунктов от цены в первой точке до точки на линии в определённое время (бар А+n).
Надеюсь дальше сам сообразишь.
22.01.2014, 09:04
Аватар для mak_kam
mak_kam mak_kam вне форума Новичок форума
Регистрация: 03.02.2013 / Сообщений: 21
Поблагодарили 15 раз(а) / Репутация: 16
Здравствуйте, Уважаемые! Помогите начинающему...
Подскажите как реализовать в коде чтобы при срабатывании отложенного ордера предыдущий рыночный однонаправленный ордер с таким же магиком закрывался?
Уважаемые подскажите хотя бы где копать пожалуйста!
22.01.2014, 09:06
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
А у меня терминал МТ4, видать у Вас какой то другой.
В МТ4:
Функций init() и deinit() нет в скриптах.
В советниках и индикаторах init() выполняется:
1. Сразу же после присоединения к графику программы
2. сразу после старта клиентского терминала
3. после смены финансового инструмента
4. после смены периода графика
5. после перекомпиляции программы в редакторе MetaEditor
6. после смены входных параметров из окна настройки эксперта или пользовательского индикатора
7. Советник также инициализируется после смены счёта
Всё по честному, терминал МТ4 билд 509.
По поводу "Функций init() и deinit() нет в скриптах. ", если они не возникают в шаблоне при его открытии в метаэдиторе, допишите из руками, а дальше всё как обычно с этими функциями.
Понятно, что правила вызова функций распространяются и на т.н. "стандартные" функции, но даже при неоднократном вызове, как INIT() так и DEINIT() каждая из этих функций выполниться один раз при запуске и останове софта.
Просто с точки зрения организации кода проще использовать их по назначению.

Последний раз редактировалось _SERG_; 22.01.2014 в 09:19.
22.01.2014, 09:36
Аватар для asers1111
asers1111 asers1111 вне форума Активный участник
Регистрация: 22.12.2011 / Сообщений: 170
Поблагодарили 42 раз(а) / Репутация: 43
Добрый день уважаемые мастера.Прежде всего СПАСИБО вам за всю предидущую помощь.Помогите,пожалуйста , с функцией.Есть у меня функция,которая позволяет определить,когда и какой был открыт предидущий ордер.
// функция возвращает 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,Le ngth,StepSize,Multiplier,MinStep,Displace,ColorMod e,StepMAMode,alerts,AlertMode,SoundsNumber,SoundsP ause,UpSound,DnSound,EmailMode,EmailsNumber,1,bar) ;
double V9Blue1 = iCustom(Symbol(),0,"StepMA_v9",TimeFrame,Pricce,Le ngth,StepSize,Multiplier,MinStep,Displace,ColorMod e,StepMAMode,alerts,AlertMode,SoundsNumber,SoundsP ause,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).
22.01.2014, 09:46
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
Всё по честному, терминал МТ4 билд 509.
По поводу "Функций init() и deinit() нет в скриптах. ", если они не возникают в шаблоне при его открытии в метаэдиторе, допишите из руками, а дальше всё как обычно с этими функциями.
Возможно. Хотя, не вижу особой надобности init() и deinit() в скрипте.
Понятно, что правила вызова функций распространяются и на т.н. "стандартные" функции, но даже при неоднократном вызове, как INIT() так и DEINIT() каждая из этих функций выполниться один раз при запуске и останове софта.
Просто с точки зрения организации кода проще использовать их по назначению.
Вот в таком коде, инициализация выполняется на каждом тике, а не только при запуске программы.
Вызов функции init() неоднократный и выполняется при каждом вызове.
int a;
int init()
{
a++;
Comment(a);
return(0);
}
int start()
{
init();
return(0);
}
Кроме того, как я привёл пример раньше. Сидит трейдер и щёлкает периоды графика каждые 5 секунд. Это переинициализирует советник и индикаторы. Если при написании программы не будет учтено такое поведение трейдера, то может привести к неправильной работе.
Я понял о чём речь. Спор не по существу, а по терминологии. Не стоит он продолжения.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!

Последний раз редактировалось Ugar; 22.01.2014 в 09:51.
22.01.2014, 10:00
Аватар для ansol
ansol ansol на форуме
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
На самом деле работать с воображаемой линией легко.
Берёшь координаты первой точки номер бара и цена, потом координаты второй точки, опять-же номер бара и цена.
Из этих координат получаешь катеты прямоугольного треугольника в шт.
№бара 1й точки минус №бара второй точки это длина горизонтального катета (А).
Цена во второй точке минус цена в первой точке, разницу разделить на Point это высота треугольника (В).
Потом вспомнить что такое тангенс (tan = В:А) и вычислив его поставить в формулу В1 = (А+n)*tan получаешь количество пунктов от цены в первой точке до точки на линии в определённое время (бар А+n).
Надеюсь дальше сам сообразишь.
Зачем такие сложности, когда есть встроенный иснтрумент? Для контроля сначала все равно придется рисовать, потом-то, конечно, необязательно, хотя лучше бы видеть, что должно произойти. Глянул и уже прикидываешь, как поступит советник, может, ему помочь надо?
22.01.2014, 10:09
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Зачем такие сложности, когда есть встроенный иснтрумент? Для контроля сначала все равно придется рисовать, потом-то, конечно, необязательно, хотя лучше бы видеть, что должно произойти. Глянул и уже прикидываешь, как поступит советник, может, ему помочь надо?
Встроенный инструмент невероятно тормозит работу в тестере. Да и не так уж это сложно. Не сложней построения объекта.
Да к тому-же это ответ на твой вопрос.

Последний раз редактировалось AlexeyVik; 22.01.2014 в 10:30.
22.01.2014, 10:25
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Возможно. Хотя, не вижу особой надобности init() и deinit() в скрипте.

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

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

Последний раз редактировалось _SERG_; 22.01.2014 в 10:30.
Ответить

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


Опции темы

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

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



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


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