Как создать массив магических чисел? - страница 2

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


Я хочу иметь уникальную метку типа магического номера, когда я размещаю ордер. Нет фиксированного количества заказов.

Каждый новый заказ должен рассматриваться как новая группа и управляться отдельно.

int ticket=OrderSend(Symbol(),OP_BUY,LotSize,MarketInfo(Symbol(),MODE_ASK),3,0,0,"My EA",12345,0,Green)
&   ticket=OrderSend(Symbol(),OP_BUY,LotSize,MarketInfo(Symbol(),MODE_ASK),3,0,0,"My EA",12345,0,Green);

Вместо того, чтобы фиксировать 12345, я бы хотел, чтобы магическое число увеличивалось с каждым новым заказом, например 1, затем следующий заказ 2, затем 3, затем 4 и т.д.

Также OrderSend находится в функции, которая не зацикливается. Как сделать что-то подобное?

Что-то вроде динамического массива[i]?

Когда я пытаюсь закрыть, я мог бы пройти через OrdersTotal() и каждый уникальный магический номер array[i] ??? И закрывал бы их в одной группе при выполнении условия.

 
7bit:
пожалуйста, не рекомендуйте подобную ерунду. Магическое число не предназначено для хранения значений, которые уже содержатся в самом ордере.

Не могли бы вы показать мне, где именно содержится в заказе Period(); ?
 
qjol:
не могли бы вы показать мне, где именно содержится порядок Period(); ?

Это не так.

ИМХО, если вы не планируете использовать других экспертов с этим, и не планируете его дарить, то вы можете использовать Magic Number для хранения всего, что захотите...

 
qjol:

не могли бы вы показать мне, где именно содержится в ордере Period(); ?
Что такое OrderPeriod()?????
 
gordon:

Это не так.

ИМХО, если вы не планируете использовать другие эксперты с этой программой, и не планируете ее отдавать, то вы можете использовать магическое число для хранения всего, что захотите...


Возможно, функция для хранения увеличивающегося магического числа.

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

Есть идеи, как сделать такую функцию?

 
johnnybegoode:

Есть идеи, как сделать такую функцию?

Есть относительно сложный пример в этой статье -> http://mqlmagazine.com/mql-programming/object-oriented-trading-an-oop-approach-to-trading/.
 
gordon:
В этой статье есть относительно сложный пример -> http://mqlmagazine.com/mql-programming/object-oriented-trading-an-oop-approach-to-trading/.


Спасибо!
Это действительно сложно, есть более простой метод?
 
johnnybegoode:


Я бы хотел, чтобы магическое число увеличивалось с каждым новым заказом, например, 1, затем следующий заказ 2, затем 3, затем 4 и т.д.

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

Вы объяснили, что вы хотите сделать (массив MN и т.д.) на основе того, что вы видите как единственное решение проблемы, но вы все еще не объяснили саму проблему, как торговая система должна решить, какие ордера закрыть, а какие оставить. Как бы это работало, если бы кто-то хотел торговать этим вручную, может быть, есть общедоступная торговая система, которая достаточно похожа на эту, чтобы объяснить концепцию, чтобы было понятно, что это за система?

Например, "обычно" (очень часто) стараются закрывать ордера, которые соответствуют определенным требованиям, которые можно определить из самого ордера, например, "самый старый ордер", "прибыль x пунктов", "безубыток", "убыток x пунктов" и т.д., а магическое число используется только для того, чтобы различать собственные сделки и сделки от совершенно разных советников.

Можно ли торговать (продолжать торговать) по этой системе вручную, если просто смотреть на график с уже открытыми ордерами и *без* прописанных к ним идентификаторов?

Что такого в вашей системе, что вам нужен один ID от одного ордера только для того, чтобы решить, нужно ли закрывать ордер? И почему вы не можете просто использовать сам номер ордера, если каждый ордер в любом случае уникален?

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

 
7bit:

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

Вы объяснили, что вы хотите сделать (массив MN и т.д.) на основе того, что вы видите как единственное решение проблемы, но вы все еще не объяснили саму проблему, как торговая система должна решить, какие ордера закрыть, а какие оставить. Как бы это работало, если бы кто-то хотел торговать этим вручную, может быть, есть общедоступная торговая система, которая достаточно похожа на эту, чтобы объяснить концепцию, чтобы было понятно, что это за система?

Например, "обычно" (очень часто) стараются закрывать ордера, удовлетворяющие определенным требованиям, которые можно определить из самого ордера, например, "самый старый ордер", "прибыль x пунктов", "безубыток", "убыток x пунктов" и т.д., а магический номер используется только для того, чтобы различать собственные сделки и сделки совершенно разных советников.

Можно ли торговать (продолжать торговать) по этой системе вручную, если просто смотреть на график с уже открытыми ордерами и *без* прописанных к ним идентификаторов?

Что такого в вашей системе, что вам нужен один ID от одного ордера только для того, чтобы решить, нужно ли закрывать ордер? И почему вы не можете просто использовать сам номер ордера, если каждый ордер в любом случае уникален?

Знание большего об этом позволит отступить назад и посмотреть на все это под другим углом и, возможно, найти гораздо более элегантное и простое решение.


"Но разве это не гарантирует, что у вас никогда не будет двух заказов с одинаковым уникальным номером".

Да, возможно иметь 2 или более заказов с уникальным номером. Делайте инкремент после групповых заказов.

 

Jon эта функция выдает уникальные номера

//+------------------------------------------------------------------+
//| Function..: SequenceNumber                                       |
//| Purpose...: Generate a sequential number.                        |
//| Returns...: dSeqNum - next sequence number.                      |
//| Notes.....: MT4 keeps the value of the global variable at the    |
//|             client terminal for 4 weeks since the last access.   |                        
//|             Use SequenceNumber() to generate a unique identity   |
//|             for each order (and passed via parameter <magic>     |
//|             number, or converted to a string and passed via the  |
//|             parameter <comment> to the OrderSend() function) as  |
//|             the trade servers of some brokers do modify the      |
//|             ticket number of a pending order when it changes to  |
//|             a market order.                                      |
//|             The same sequence number could, for example, be used |
//|             to identify the two positions of a straddle order.   |
//|             ******************************************************
//|             * If the expert has to close partial lots, then MT4  *
//|             * retains in the new order the contents of the       *
//|             * OrderMagicNumber() but loses OrderComment().       *
//|             ******************************************************
//| Sample....: string sNumber=DoubleToStr(SequenceNumber(),0);      |
//|             if(OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point,   |
//|                          Ask+25*Point,sNumber,16384,0,Green) > 0)|
//|                OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point,   |
//|                          Ask+65*Point,sNumber,16384,0,Green);    |
//+------------------------------------------------------------------+
double SequenceNumber() {
  double dSeqNum=1, d;
  string sName="SequenceNumber";

  while(GlobalVariableCheck("Semaphore")) d+=0;
  GlobalVariableSet("Semaphore",1);
  if(GlobalVariableCheck(sName)) dSeqNum=GlobalVariableGet(sName)+1;
  GlobalVariableSet(sName,dSeqNum);
  GlobalVariableDel("Semaphore");
  return(dSeqNum);
}