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

AlexeyVik

Программист mql4 mql5
Не люблю я двухмерные :)
Собственно, если не влом и есть время, вот код, закомментирована функция, которая убирает дубликаты символов, но не суммирует профит.
И спасибо за помощь.

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

Примерный алгоритм:
//Объявляем массив
double _Ord[25][25]; // double потому, что в этот массив будут записаны не только целые, но и дробные данные, такие как например OrderOpenPrice();
//потом в цикле его заполняем.
total = OrdersTotal();
for(int i = 0; i < total; i++)
{
_Ord[0] = OrderTicket();
_Ord[1] = OrderProfit();
// другие необходимые данные
}
Проблема возникает только для совмещения символов с таким массивом. Но если напрячь мышцы головы, то можно эту задачу решить ещё одним массивом в котором порядковый номер строки будет соответствовать символу и соответственно этот номет можно будет вписать в числовой массив и потом с успехом его используя прочесть символ ордера. Или второй вариант, по тикету ордера его выбрать и прочесть символ ордера.
 

hoz

Активный участник
У меня тоже вопрос по массивами, над которым я ломаю голову уже несколько дней.
Суть такая, .. Есть код, который работает. Я приведу то что нужно, дабы не путать никого лишим кодом, т.к. так всё очень перекручено (писал очень опытный программист). А мне интересно в данном коде только приём, как по каждому сигналу советника (сигналов может быть сколько угодно) открывать только одну сделку..

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

PHP:
int start()
{
   static datetime barTime = 0;
   if (barTime == iTime(NULL, i_trading_TF, 0))
      return (0);

   int signal[4];
   CalcSignals(signal);

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

   barTime = iTime(NULL, i_trading_TF, 0);
   return (0);
}
А вот нужные для понимания моего вопроса функции:

PHP:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void CalcSignals(int& signal[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   for (int i = 0; i < 4; i++)
   {
      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(int& signal[])
{
   for (int i = 0; i < 4; i++)
   {   
      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() мы получаем сигнал и связываем параметр с самим массивом, а во втором нам нужно лишь получить данные с массива, поэтому по логике не нужно связывать по ссылке формальный параметр с самим массивом. Верно я мыслю? И вообще понимаю как работает данный участок кода?
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
У меня тоже вопрос по массивами, над которым я ломаю голову уже несколько дней.
Суть такая, .. Есть код, который работает. Я приведу то что нужно, дабы не путать никого лишим кодом, т.к. так всё очень перекручено (писал очень опытный программист). А мне интересно в данном коде только приём, как по каждому сигналу советника (сигналов может быть сколько угодно) открывать только одну сделку..

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

PHP:
int start()
{
   static datetime barTime = 0;
   if (barTime == iTime(NULL, i_trading_TF, 0))
      return (0);

   int signal[4];
   CalcSignals(signal);

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

   barTime = iTime(NULL, i_trading_TF, 0);
   return (0);
}
А вот нужные для понимания моего вопроса функции:

PHP:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void CalcSignals(int& signal[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   for (int i = 0; i < 4; i++)
   {
      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(int& signal[])
{
   for (int i = 0; i < 4; i++)
   {   
      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) Что-то давно его не видно...
 
Последнее редактирование модератором:

hoz

Активный участник
А я уже смотрю в этот код несколько дней, и мозг уже закипает. Что-то уже понимаю чётко, но попутно начали появляться гораздо сложнейшие вопросы, ежели были раньше..
 

vetallic

Местный знаток
народ? есть одна идея...
требуется вывод инфы цены от начала открытия дня в пунктах пары...
...мож кто видел такой индикатор поковырять код, а то есть 1 но сложный сильно :question: , выдираю - барабуля получается...

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

СПАСИБ!
 
Последнее редактирование:

hoz

Активный участник
народ? есть одна идея...
требуется вывод инфы цены от начала открытия дня в пунктах пары...
...мож кто видел такой индикатор поковырять код, а то есть 1 но сложный сильно :question: , выдираю - барабуля получается...

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

СПАСИБ!


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

PHP:
MathAbs(( Ask - iOpen[Symbol(),1440,0] )) / MarketInfo(Symbol(),MODE_POINT}
 
Последнее редактирование:

vetallic

Местный знаток
вот тип такого вышло, но с ошибкой...
пишет вместо пунктов -0,38230000 (мне под 4 знака)
гляньте где лажанулся...
:question:

#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);
}
 

AlexeyVik

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

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

#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 было деление на поинт, а ты это деление упустил, вот и получил результат не в пунктах, а как разницу двух цен.
 

hoz

Активный участник
Появилась мысль использовать, в общем то, всем известные паттерны из ряда Price Action, которые называются DBLHC и DBHLC.



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

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

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

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

Цена открытия текущего бара должна быть рядом с минимумом предыдущего бара. Написать то легко.. Но нас интересует вариант, что таких баров с одинаковыми минимумами или почти одинаковыми минимумами может быть более одного, например 5. Как быть тогда? Как задать это условие, чтоб учесть не только предыдущий бар, но и расположенные раньше в историю тоже?
 

vetallic

Местный знаток
спасиб :),
терь осталось убрать 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);
}
 

hoz

Активный участник
спасиб :),
терь осталось убрать 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);
}

Нормализуй вывод и всё..
 

AlexeyVik

Программист mql4 mql5
спасиб :),
терь осталось убрать 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);
 

hoz

Активный участник
Как получить данные из индюка GenesisMatrix 2.21_1 ?
Что-то я не могу понять, с чем значения его буфера сравнивать вообще. Ни значения там нет, ни.. цвет меняется только. Подскажите, как вытащить сигнал при появлении 4 одинаковых квадратиков.
Там 4 квадратика down и 4 квадратика Up. Если у обычного индюка есть какие-то границы, диапазон значени и тд, то тут непонятно что вообще к чему. Мне стало интересно как " таким чудом " пользоваться.
Надеюсь кто-н. подскажет..
 

Вложения

  • Genesis+Matrix+Trading.rar
    73,4 КБ · Просмотры: 32

hoz

Активный участник
Вот функция посылающая ордер и модифицирующая его после посыла. Ставить в данном случае нужно только стоп.

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 > 0 && OrderSelect(ticket,SELECT_BY_TICKET) == true)
  {
     if (i_sl != 0 && 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;

Что не верно? Функция это не для рыночной торговли, а для теста. Я не учитывал ни реквот ни чего лишнего. В других экспертах подобная конструкция работает, а в этом нет.
Раньше у меня эксперты все писались на отложках, а эта первая посылает рыночный ордер. Думаю что-то с этим связано.
В чём я не прав?

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

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

 
Последнее редактирование:

Nata_FX

Активный участник
Ошибка 130 - неправильный стоп.
PHP:
OrderOpenPrice() = 1.2789
i_sl_Norma = 1.2789
У тебя цена открытия ордера и стоп совпадают, естественно терминал не дает модифицировать ордер. Проверь переменную pt скорее всего она равна 0.
 

eevviill

Заблокирован
Как получить данные из индюка GenesisMatrix 2.21_1 ?
Что-то я не могу понять, с чем значения его буфера сравнивать вообще. Ни значения там нет, ни.. цвет меняется только. Подскажите, как вытащить сигнал при появлении 4 одинаковых квадратиков.
Там 4 квадратика down и 4 квадратика Up. Если у обычного индюка есть какие-то границы, диапазон значени и тд, то тут непонятно что вообще к чему. Мне стало интересно как " таким чудом " пользоваться.
Надеюсь кто-н. подскажет..
В Ините удали перебор вконце.
 

Алекc1234

Местный житель
Приветствую всех! Как написать в коде "Если ордер закрылся по стоплоссу..."
 

Алекc1234

Местный житель
if(OrderClosePrice()==OrderStopLoss())
Перед тем надо выбрать ордер с исторических данных.

Скажите, а можно написать так, что если ордер закрылся на определённой цене в минус(скажем на N пунктов больше, чем стоплосс или на N пунктов меньше чем цена открытия ордера?
 
Верх