Ответ
 
Опции темы
Старый 09.01.2013, 10:05   #801 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,529
Репутация: 3649
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,118
Поблагодарили 3,653 раз(а) в 1,472 сообщениях
Поинты: 2007
Сообщение от Dm_35 Посмотреть сообщение
Не люблю я двухмерные
Собственно, если не влом и есть время, вот код, закомментирована функция, которая убирает дубликаты символов, но не суммирует профит.
И спасибо за помощь.
Не то, чтобы влом, но править чужой код не очень приятно. Дело в том, что к решению такой задачи я подошёл-бы совершенно по-другому. Вот как раз двухмерный массив и спасает в этом случае.

Примерный алгоритм:
//Объявляем массив
double _Ord[25][25]; // double потому, что в этот массив будут записаны не только целые, но и дробные данные, такие как например OrderOpenPrice();
//потом в цикле его заполняем.
total = OrdersTotal();
for(int i = 0; i < total; i++)
{
_Ord[i][0] = OrderTicket();
_Ord[i][1] = OrderProfit();
// другие необходимые данные
}
Проблема возникает только для совмещения символов с таким массивом. Но если напрячь мышцы головы, то можно эту задачу решить ещё одним массивом в котором порядковый номер строки будет соответствовать символу и соответственно этот номет можно будет вписать в числовой массив и потом с успехом его используя прочесть символ ордера. Или второй вариант, по тикету ордера его выбрать и прочесть символ ордера.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (09.01.2013)
Старый 09.01.2013, 16:14   #802 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
У меня тоже вопрос по массивами, над которым я ломаю голову уже несколько дней.
Суть такая, .. Есть код, который работает. Я приведу то что нужно, дабы не путать никого лишим кодом, т.к. так всё очень перекручено (писал очень опытный программист). А мне интересно в данном коде только приём, как по каждому сигналу советника (сигналов может быть сколько угодно) открывать только одну сделку..

В start вот что есть:

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

PHP код:
int start()
{
   static 
datetime barTime 0;
   if (
barTime == iTime(NULLi_trading_TF0))
      return (
0);

   
int signal[4];
   
CalcSignals(signal);

   if (!
Trade(signal))
      return (
0);

   
barTime iTime(NULLi_trading_TF0);
   return (
0);

А вот нужные для понимания моего вопроса функции:

PHP код:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPerioddoubleprevMA)
{
   
prevMA iMA(NULLi_trading_TFmaPeriod0MODE_EMAMODE_CLOSE1);
   return (
iMA(NULLi_trading_TFmaPeriod0MODE_EMAMODE_CLOSE0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void CalcSignals(intsignal[])
{
   
double ema365_1;
   
double ema365_0 GetCurAndPrevMA(365ema365_1);

   for (
int i 04i++)
   {
      
double ema1;
      
double ema0 GetCurAndPrevMA(g_maPeriod[i], ema1);
      
signal[i] = SIGNAL_NO;

      if (
ema1 ema365_1 && ema0 ema365_0)
         
signal[i] = SIGNAL_BUY;
      if (
ema1 ema365_1 && ema0 ema365_0)
         
signal[i] = SIGNAL_SELL;
   }
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(intsignal[])
{
   for (
int i 04i++)
   {   
      if (
signal[i] == SIGNAL_BUY && FindOrders(g_signMA[i]) == 0)
         if (!
OpenBuy(g_signMA[i]))
            return (
false);

      if (
signal[i] == SIGNAL_SELL && FindOrders(g_signMA[i]) == 0)
         if (!
OpenSell(g_signMA[i]))
            return (
false);
   }
 
   return (
true);

Если начать читать код со старте, как это и нужно делать, с момента объявления массива, то:

1. Объявляем массив с 4 элементами.
2. В строке

PHP код:
CalcSignals(signal); 
как я понял, мы вызываем функцию CalcSignals(signal) с именем массива signal[4] в параметре, чтобы заполнить массив сигналами, верно?
3. Здесь

PHP код:
if (!Trade(signal))
      return (
0); 
По каждому сигналу (каждому элементу массива) эксперт принимает решение торговать или нет, в зависимости от условий в прописанных в функции Trade(signal).
[свернуть]


По сколько в функциях void CalcSignals(int& signal[]) и bool Trade(int& signal[]) параметр функции является указателем на массив, то странно то, что в CalcSignals() мы получаем сигнал и связываем параметр с самим массивом, а во втором нам нужно лишь получить данные с массива, поэтому по логике не нужно связывать по ссылке формальный параметр с самим массивом. Верно я мыслю? И вообще понимаю как работает данный участок кода?

Последний раз редактировалось chocolate; 19.01.2013 в 13:21.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 09.01.2013, 18:44   #803 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,529
Репутация: 3649
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,118
Поблагодарили 3,653 раз(а) в 1,472 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
У меня тоже вопрос по массивами, над которым я ломаю голову уже несколько дней.
Суть такая, .. Есть код, который работает. Я приведу то что нужно, дабы не путать никого лишим кодом, т.к. так всё очень перекручено (писал очень опытный программист). А мне интересно в данном коде только приём, как по каждому сигналу советника (сигналов может быть сколько угодно) открывать только одну сделку..

В start вот что есть:

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

PHP код:
int start()
{
   static 
datetime barTime 0;
   if (
barTime == iTime(NULLi_trading_TF0))
      return (
0);

   
int signal[4];
   
CalcSignals(signal);

   if (!
Trade(signal))
      return (
0);

   
barTime iTime(NULLi_trading_TF0);
   return (
0);

А вот нужные для понимания моего вопроса функции:

PHP код:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPerioddoubleprevMA)
{
   
prevMA iMA(NULLi_trading_TFmaPeriod0MODE_EMAMODE_CLOSE1);
   return (
iMA(NULLi_trading_TFmaPeriod0MODE_EMAMODE_CLOSE0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void CalcSignals(intsignal[])
{
   
double ema365_1;
   
double ema365_0 GetCurAndPrevMA(365ema365_1);

   for (
int i 04i++)
   {
      
double ema1;
      
double ema0 GetCurAndPrevMA(g_maPeriod[i], ema1);
      
signal[i] = SIGNAL_NO;

      if (
ema1 ema365_1 && ema0 ema365_0)
         
signal[i] = SIGNAL_BUY;
      if (
ema1 ema365_1 && ema0 ema365_0)
         
signal[i] = SIGNAL_SELL;
   }
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(intsignal[])
{
   for (
int i 04i++)
   {   
      if (
signal[i] == SIGNAL_BUY && FindOrders(g_signMA[i]) == 0)
         if (!
OpenBuy(g_signMA[i]))
            return (
false);

      if (
signal[i] == SIGNAL_SELL && FindOrders(g_signMA[i]) == 0)
         if (!
OpenSell(g_signMA[i]))
            return (
false);
   }
 
   return (
true);

Если начать читать код со старте, как это и нужно делать, с момента объявления массива, то:

1. Объявляем массив с 4 элементами.
2. В строке

PHP код:
CalcSignals(signal); 
как я понял, мы вызываем функцию CalcSignals(signal) с именем массива signal[4] в параметре, чтобы заполнить массив сигналами, верно?
3. Здесь

PHP код:
if (!Trade(signal))
      return (
0); 
По каждому сигналу (каждому элементу массива) эксперт принимает решение торговать или нет, в зависимости от условий в прописанных в функции Trade(signal).
[свернуть]


По сколько в функциях void CalcSignals(int& signal[]) и bool Trade(int& signal[]) параметр функции является указателем на массив, то странно то, что в CalcSignals() мы получаем сигнал и связываем параметр с самим массивом, а во втором нам нужно лишь получить данные с массива, поэтому по логике не нужно связывать по ссылке формальный параметр с самим массивом. Верно я мыслю? И вообще понимаю как работает данный участок кода?
В программировании довольно много непоняток. В данном случае возможна перестраховка от потери данных массива в функции Trade(int& signal[])

Но, точней на такой вопрос может ответить Андрей (Ugar) Что-то давно его не видно...

Последний раз редактировалось chocolate; 19.01.2013 в 13:21.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (09.01.2013)
Старый 09.01.2013, 18:58   #804 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
А я уже смотрю в этот код несколько дней, и мозг уже закипает. Что-то уже понимаю чётко, но попутно начали появляться гораздо сложнейшие вопросы, ежели были раньше..
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 09.01.2013, 21:57   #805 (permalink)
Местный знаток
 
Аватар для vetallic
 
Регистрация: 31.08.2010
Сообщений: 352
Репутация: 511
vetallic - vetallic - vetallic - vetallic - vetallic - vetallic -
Сказал(а) спасибо: 87
Поблагодарили 509 раз(а) в 104 сообщениях
Поинты: 96
народ? есть одна идея...
требуется вывод инфы цены от начала открытия дня в пунктах пары...
...мож кто видел такой индикатор поковырять код, а то есть 1 но сложный сильно , выдираю - барабуля получается...

нужно просто тип - EURUSD +45p

СПАСИБ!

Последний раз редактировалось vetallic; 09.01.2013 в 22:01.
vetallic вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 09.01.2013, 22:13   #806 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от vetallic Посмотреть сообщение
народ? есть одна идея...
требуется вывод инфы цены от начала открытия дня в пунктах пары...
...мож кто видел такой индикатор поковырять код, а то есть 1 но сложный сильно , выдираю - барабуля получается...

нужно просто тип - EURUSD +45p

СПАСИБ!

Формула расчёта количества пунктов от начала открытия дня до текущего момента будет такая:

PHP код:
MathAbs(( Ask iOpen[Symbol(),1440,0] )) / MarketInfo(Symbol(),MODE_POINT

Последний раз редактировалось hoz; 09.01.2013 в 22:16.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (10.01.2013), vetallic (09.01.2013)
Старый 09.01.2013, 23:35   #807 (permalink)
Местный знаток
 
Аватар для vetallic
 
Регистрация: 31.08.2010
Сообщений: 352
Репутация: 511
vetallic - vetallic - vetallic - vetallic - vetallic - vetallic -
Сказал(а) спасибо: 87
Поблагодарили 509 раз(а) в 104 сообщениях
Поинты: 96
вот тип такого вышло, но с ошибкой...
пишет вместо пунктов -0,38230000 (мне под 4 знака)
гляньте где лажанулся...


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



#property indicator_chart_window

extern int corner = 0;
extern int y_offset = 0;
extern int x_offset = 125;

int init() {

CreateOL("Pip2OpL", x_offset + 12, y_offset + 109);
CreateOL("Pip2OpT", x_offset + 64, y_offset + 109);

return (0);
}


int start()
{
string EURUSD = "";
EURUSD = (Ask - iOpen("EURUSD",1440,0));
MarketInfo("EURUSD",MODE_POINT);

ObjectSetText("Pip2OpL", "Pips Open", 7, "Arial", Red);
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", Red);

return (0);
}

int CreateOL(string a_name_0, int a_x_8, int a_y_12) {
ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(a_name_0, OBJPROP_CORNER, corner);
ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8);
ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12);
ObjectSet(a_name_0, OBJPROP_BACK, FALSE);
return (0);
}

int deinit()
{
ObjectDelete("Pip2OpL");
ObjectDelete("Pip2OpT");
return(0);
}

[свернуть]
vetallic вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 10.01.2013, 06:33   #808 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,529
Репутация: 3649
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,118
Поблагодарили 3,653 раз(а) в 1,472 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Формула расчёта количества пунктов от начала открытия дня до текущего момента будет такая:

PHP код:
MathAbs(( Ask iOpen[Symbol(),1440,0] )) / MarketInfo(Symbol(),MODE_POINT
hoz, небольшое замечание.
Каждая пара скобок увеличивает время выполнения кода. Поэтому если можно обойтись без них то упускать такую возможность не нужно. Я бы написал так.
MathAbs(Bid - iOpen(NULL, PERIOD_D1, 0)) / Point;
Сообщение от vetallic Посмотреть сообщение
вот тип такого вышло, но с ошибкой...
пишет вместо пунктов -0,38230000 (мне под 4 знака)
гляньте где лажанулся...


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



#property indicator_chart_window

extern int corner = 0;
extern int y_offset = 0;
extern int x_offset = 125;

int init() {

CreateOL("Pip2OpL", x_offset + 12, y_offset + 109);
CreateOL("Pip2OpT", x_offset + 64, y_offset + 109);

return (0);
}


int start()
{
string EURUSD = "";
EURUSD = (Ask - iOpen("EURUSD",1440,0));
MarketInfo("EURUSD",MODE_POINT);


ObjectSetText("Pip2OpL", "Pips Open", 7, "Arial", Red);
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", Red);

return (0);
}

int CreateOL(string a_name_0, int a_x_8, int a_y_12) {
ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(a_name_0, OBJPROP_CORNER, corner);
ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8);
ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12);
ObjectSet(a_name_0, OBJPROP_BACK, FALSE);
return (0);
}

int deinit()
{
ObjectDelete("Pip2OpL");
ObjectDelete("Pip2OpT");
return(0);
}

[свернуть]
В формуле hoz было деление на поинт, а ты это деление упустил, вот и получил результат не в пунктах, а как разницу двух цен.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
5 пользователя(ей) сказали cпасибо:
ale002 (10.01.2013), eevviill (10.01.2013), hoz (10.01.2013), vetallic (10.01.2013), Алекc1234 (10.01.2013)
Старый 10.01.2013, 09:05   #809 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Появилась мысль использовать, в общем то, всем известные паттерны из ряда Price Action, которые называются DBLHC и DBHLC.



Условия его формирования:

DBLHC (Бычий сетап) - бары с одинаковыми минимумами и более высоким закрытием.
Два (могут быть три и более) последовательных бара с одинаковыми минимумами, при этом цена закрытия последнего больше максимума предыдущего. Разница минимумов смежных баров не должна превышать 3 пунктов. Чем больше баров составляют сетап, тем сильнее сигнал, генерируемый им.

DBHLC (Медвежий сетап) - бары с одинаковым максимумом и более низким закрытием.
Два (три и более) последовательных бара с одинаковыми максимумами, при этом цена закрытия последнего ниже минимума предыдущего. Разница максимумов смежных баров не должна превышать 3 пунктов. Чем больше баров составляют сетап, тем сильнее сигнал, генерируемый им.

Возьмём, например, вариант DBLHC (Бычий сетап)

Цена открытия текущего бара должна быть рядом с минимумом предыдущего бара. Написать то легко.. Но нас интересует вариант, что таких баров с одинаковыми минимумами или почти одинаковыми минимумами может быть более одного, например 5. Как быть тогда? Как задать это условие, чтоб учесть не только предыдущий бар, но и расположенные раньше в историю тоже?
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 10.01.2013, 13:25   #810 (permalink)
Местный знаток
 
Аватар для vetallic
 
Регистрация: 31.08.2010
Сообщений: 352
Репутация: 511
vetallic - vetallic - vetallic - vetallic - vetallic - vetallic -
Сказал(а) спасибо: 87
Поблагодарили 509 раз(а) в 104 сообщениях
Поинты: 96
спасиб ,
терь осталось убрать 0000000000 после пунктов а то выводит - 45,0000000
и как проще реализовать смену цветов (если + то зелёное, - красное)...

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



//+------------------------------------------------------------------+
//| !qw.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window

#property indicator_color1 Green
#property indicator_color2 Red


extern int corner = 0;
extern int y_offset = 0;
extern int x_offset = 125;

double ExtBuffer1[];
double ExtBuffer2[];


//-------------------------------------------------------
int init() {

CreateOL("Pip2OpL", x_offset + 12, y_offset + 109);
CreateOL("Pip2OpT", x_offset + 64, y_offset + 109);

//----
SetIndexStyle (0,DRAW_HISTOGRAM, EMPTY,4,Green);
SetIndexBuffer(0,ExtBuffer1);
SetIndexStyle (1,DRAW_HISTOGRAM, EMPTY,4,Red);
SetIndexBuffer(1,ExtBuffer2);


return (0);
}

//------------------------------------------------------------------------
int start()
{
string EURUSD = "";
EURUSD = MathAbs(Bid - iOpen("EURUSD", PERIOD_D1, 0)) / Point;

ObjectSetText("Pip2OpL", "EURUSD", 7, "Arial", Red);
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", Red);

return (0);
}

//-------------------------------------------------------------
int CreateOL(string a_name_0, int a_x_8, int a_y_12) {
ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(a_name_0, OBJPROP_CORNER, corner);
ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8);
ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12);
ObjectSet(a_name_0, OBJPROP_BACK, FALSE);
return (0);
}

int deinit()
{
ObjectDelete("Pip2OpL");
ObjectDelete("Pip2OpT");
return(0);
}


[свернуть]
vetallic вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 10.01.2013, 13:31   #811 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от vetallic Посмотреть сообщение
спасиб ,
терь осталось убрать 0000000000 после пунктов а то выводит - 45,0000000
и как проще реализовать смену цветов (если + то зелёное, - красное)...

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



//+------------------------------------------------------------------+
//| !qw.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| MetaTrader 5 Trading Platform / MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window

#property indicator_color1 Green
#property indicator_color2 Red


extern int corner = 0;
extern int y_offset = 0;
extern int x_offset = 125;

double ExtBuffer1[];
double ExtBuffer2[];


//-------------------------------------------------------
int init() {

CreateOL("Pip2OpL", x_offset + 12, y_offset + 109);
CreateOL("Pip2OpT", x_offset + 64, y_offset + 109);

//----
SetIndexStyle (0,DRAW_HISTOGRAM, EMPTY,4,Green);
SetIndexBuffer(0,ExtBuffer1);
SetIndexStyle (1,DRAW_HISTOGRAM, EMPTY,4,Red);
SetIndexBuffer(1,ExtBuffer2);


return (0);
}

//------------------------------------------------------------------------
int start()
{
string EURUSD = "";
EURUSD = MathAbs(Bid - iOpen("EURUSD", PERIOD_D1, 0)) / Point;

ObjectSetText("Pip2OpL", "EURUSD", 7, "Arial", Red);
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", Red);

return (0);
}

//-------------------------------------------------------------
int CreateOL(string a_name_0, int a_x_8, int a_y_12) {
ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(a_name_0, OBJPROP_CORNER, corner);
ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8);
ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12);
ObjectSet(a_name_0, OBJPROP_BACK, FALSE);
return (0);
}

int deinit()
{
ObjectDelete("Pip2OpL");
ObjectDelete("Pip2OpT");
return(0);
}


[свернуть]
Нормализуй вывод и всё..
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
eevviill (10.01.2013)
Старый 10.01.2013, 14:23   #812 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,529
Репутация: 3649
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,118
Поблагодарили 3,653 раз(а) в 1,472 сообщениях
Поинты: 2007
Сообщение от vetallic Посмотреть сообщение
спасиб ,
терь осталось убрать 0000000000 после пунктов а то выводит - 45,0000000
и как проще реализовать смену цветов (если + то зелёное, - красное)...

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



//+------------------------------------------------------------------+
//| !qw.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| MetaTrader 5 Trading Platform / MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window

#property indicator_color1 Green
#property indicator_color2 Red


extern int corner = 0;
extern int y_offset = 0;
extern int x_offset = 125;

double ExtBuffer1[];
double ExtBuffer2[];


//-------------------------------------------------------
int init() {

CreateOL("Pip2OpL", x_offset + 12, y_offset + 109);
CreateOL("Pip2OpT", x_offset + 64, y_offset + 109);

//----
SetIndexStyle (0,DRAW_HISTOGRAM, EMPTY,4,Green);
SetIndexBuffer(0,ExtBuffer1);
SetIndexStyle (1,DRAW_HISTOGRAM, EMPTY,4,Red);
SetIndexBuffer(1,ExtBuffer2);


return (0);
}

//------------------------------------------------------------------------
int start()
{
string EURUSD = "";
EURUSD = MathAbs(Bid - iOpen("EURUSD", PERIOD_D1, 0)) / Point;

ObjectSetText("Pip2OpL", "EURUSD", 7, "Arial", Red);
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", Red);

return (0);
}

//-------------------------------------------------------------
int CreateOL(string a_name_0, int a_x_8, int a_y_12) {
ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
ObjectSet(a_name_0, OBJPROP_CORNER, corner);
ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_8);
ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_12);
ObjectSet(a_name_0, OBJPROP_BACK, FALSE);
return (0);
}

int deinit()
{
ObjectDelete("Pip2OpL");
ObjectDelete("Pip2OpT");
return(0);
}


[свернуть]
Тогда надо убрать MathAbs
EURUSD = (Bid - iOpen("EURUSD", PERIOD_D1, 0)) / Point;
тогда получишь то + то -
потом условие
if(EURUSD > 0) rg = Green;
else if(EURUSD < 0) rg = Red;
ObjectSetText("Pip2OpT", ": " + EURUSD + "", 7, "Arial", rg);
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
3 пользователя(ей) сказали cпасибо:
eevviill (10.01.2013), hoz (10.01.2013), vetallic (10.01.2013)
Старый 10.01.2013, 20:13   #813 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Как получить данные из индюка GenesisMatrix 2.21_1 ?
Что-то я не могу понять, с чем значения его буфера сравнивать вообще. Ни значения там нет, ни.. цвет меняется только. Подскажите, как вытащить сигнал при появлении 4 одинаковых квадратиков.
Там 4 квадратика down и 4 квадратика Up. Если у обычного индюка есть какие-то границы, диапазон значени и тд, то тут непонятно что вообще к чему. Мне стало интересно как " таким чудом " пользоваться.
Надеюсь кто-н. подскажет..
Вложения:
Тип файла: rar Genesis+Matrix+Trading.rar (73.4 Кб, 19 просмотров)
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 10.01.2013, 23:10   #814 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Вот функция посылающая ордер и модифицирующая его после посыла. Ставить в данном случае нужно только стоп.

PHP код:
bool OpenSell()
{
  
int ticket = -1;
  
string myNote "Сов шортанул";
  
  
  
ticket OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,myNote,i_myMagic,0,Red);
  Print(
"ticket = "ticket);
  
//Comment("ticket = ", ticket);
  
Print("i_sl_Norma = "NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits));
  Print(
"i_sl = "i_sl);
  Print(
"OrderOpenPrice() = "OrderOpenPrice());
  Print(
"Ask = "Ask);
  Print(
"Bid = "Bid);
  
  if (
ticket && OrderSelect(ticket,SELECT_BY_TICKET) == true)
  {
     if (
i_sl != && OrderStopLoss() == 0)
     {
       if (!
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits),0,0,Red))
        return(
false);
     }
  }
  return(
true);


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

Код:
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderModify error 130
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Bid = 1.2781
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Ask = 1.2782
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderOpenPrice() = 1.2789
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: i_sl = 15
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: i_sl_Norma = 1.2789
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: ticket = 241
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: open #241 sell 0.10 EURUSD at 1.27811 ok
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderModify error 130
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Bid = 1.2781
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Ask = 1.2782
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderOpenPrice() = 1.2789
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: i_sl = 15
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: i_sl_Norma = 1.2789
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: ticket = 185
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: open #185 sell 0.10 EURUSD at 1.27867 ok
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderModify error 130
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Bid = 1.2786
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: Ask = 1.2788
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: OrderOpenPrice() = 1.2789
2013.01.11 01:02:58	2012.11.20 00:12  Genesis_Matrix_by_Roman EURUSD,M5: i_sl = 15
2013.01.11 01:02:53	2012.11.20 00:00  GannHiLo-Histo EURUSD,M5: loaded successfully
2013.01.11 01:02:53	2012.11.20 00:00  T3_2ColorHisto EURUSD,M5: loaded successfully
2013.01.11 01:02:53	2012.11.20 00:00  TVI EURUSD,M5: loaded successfully
2013.01.11 01:02:53	2012.11.20 00:00  GenesisMatrix 2.21_1 EURUSD,M5: loaded successfully
2013.01.11 01:02:53	Genesis_Matrix_by_Roman inputs: i_myMagic=3333021;
Что не верно? Функция это не для рыночной торговли, а для теста. Я не учитывал ни реквот ни чего лишнего. В других экспертах подобная конструкция работает, а в этом нет.
Раньше у меня эксперты все писались на отложках, а эта первая посылает рыночный ордер. Думаю что-то с этим связано.
В чём я не прав?

По сути условие на тикет должно проходить, т.к. тикет сразу принимает значение больше нуля и то видно в журнале, что ордера то идут. Тока оператор принт "тормознутый", а потому пачка их просто проскочила мимо журнала сразу в лог. Есс-но ордер раз тикет присуствует выбран будет, иначе и быть не может.
Тогда почему не модятся ордера?

Они пачками открываются, а функция модификации и что за ней идёт дальше уже не работает. Т.е.как я понял, эксперт не может выйти из функции..


Последний раз редактировалось hoz; 10.01.2013 в 23:16.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 11.01.2013, 01:06   #815 (permalink)
Активный участник
 
Аватар для Nata_FX
 
Регистрация: 12.10.2011
Сообщений: 50
Репутация: 36
Nata_FX
Сказал(а) спасибо: 10
Поблагодарили 35 раз(а) в 23 сообщениях
Поинты: 4
Ошибка 130 - неправильный стоп.
PHP код:
OrderOpenPrice() = 1.2789
i_sl_Norma 
1.2789 
У тебя цена открытия ордера и стоп совпадают, естественно терминал не дает модифицировать ордер. Проверь переменную pt скорее всего она равна 0.
Nata_FX на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
eevviill (11.01.2013), hoz (11.01.2013)
Старый 11.01.2013, 09:05   #816 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от hoz Посмотреть сообщение
Как получить данные из индюка GenesisMatrix 2.21_1 ?
Что-то я не могу понять, с чем значения его буфера сравнивать вообще. Ни значения там нет, ни.. цвет меняется только. Подскажите, как вытащить сигнал при появлении 4 одинаковых квадратиков.
Там 4 квадратика down и 4 квадратика Up. Если у обычного индюка есть какие-то границы, диапазон значени и тд, то тут непонятно что вообще к чему. Мне стало интересно как " таким чудом " пользоваться.
Надеюсь кто-н. подскажет..
В Ините удали перебор вконце.
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 11.01.2013, 09:09   #817 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Приветствую всех! Как написать в коде "Если ордер закрылся по стоплоссу..."
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 11.01.2013, 09:14   #818 (permalink)
Заблокирован
За второе место в конкурсе 

 
Аватар для eevviill
 
Регистрация: 30.07.2009
Сообщений: 5,474
Репутация: 9022
eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill eevviill
Сказал(а) спасибо: 13,680
Поблагодарили 9,022 раз(а) в 3,179 сообщениях
Поинты: 1105
Отправить сообщение для eevviill с помощью Skype™
Сообщение от Алекc1234 Посмотреть сообщение
Приветствую всех! Как написать в коде "Если ордер закрылся по стоплоссу..."
if(OrderClosePrice()==OrderStopLoss())
Перед тем надо выбрать ордер с исторических данных.
eevviill вне форума   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
alexshell (11.01.2013), Алекc1234 (11.01.2013)
Старый 11.01.2013, 09:44   #819 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от eevviill Посмотреть сообщение
if(OrderClosePrice()==OrderStopLoss())
Перед тем надо выбрать ордер с исторических данных.
Спасибо, всё заработало так, как хотел!
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
alexshell (11.01.2013)
Старый 11.01.2013, 10:41   #820 (permalink)
Местный житель
 
Аватар для Алекc1234
 
Регистрация: 24.03.2011
Сообщений: 697
Репутация: 276
Алекc1234 Алекc1234 Алекc1234
Сказал(а) спасибо: 391
Поблагодарили 276 раз(а) в 176 сообщениях
Поинты: 0
Сообщение от eevviill Посмотреть сообщение
if(OrderClosePrice()==OrderStopLoss())
Перед тем надо выбрать ордер с исторических данных.
Скажите, а можно написать так, что если ордер закрылся на определённой цене в минус(скажем на N пунктов больше, чем стоплосс или на N пунктов меньше чем цена открытия ордера?
Алекc1234 на форуме   Ответить с цитированиемОтветить с цитированием  
Ответ

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


Опции темы

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

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



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


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