Для замка

 

Всем Добрый день! Смотрела по форуму, так и не поняла куда написать вопрос, решила сюда, надеюсь уважаемый Марк не будет против. Возможно он покажется не совсем обоснованным, просто я в програмировании совершенно не разбираюсь. Однако мне нужен скрипт или советник который при открытии ценой отложенного ордера будет выставлять отложник в противоположную сторону.

Обрисовываю ситуацию:

1 Есть открытая позиция и отложенный ордер, стандартный замок.

2 Цена открывает отложник и в этот же момент должен выставиться другой отложник в противоположную сторону.

3 Когда(если) откроется последний отложник должен выставиться следующий в противоположном направлении и т.д.

Мне очень нужно. Хотя бы общую картину. Заранее благодарна!

 
Vera писал (а) >>

Всем Добрый день! Смотрела по форуму, ... ... надеюсь уважаемый Марк не будет против.

Кто такой "уважаемый Макр" ?

(я бы выложил похожий примерно эксперт, но вдруг он всё таки против ?)

 
Смелее ridМакр'а я беру на себя! :))
 

Вот нечто очень похожее. Взял здесь же, в одной из веток. (Да простит меня таинственный Марк)

Файлы:
 
И правда похожее, но не совсем. Вобщем просить заготовок не буду, просто попрошу объяснять мне по ходу процесса кое какие детали, вот, например, как написать функцию которая возвращает количество открытых ордеров ТОЛЬКО того или иного типа.
 
Vera писал (а) >>
И правда похожее, но не совсем. Вобщем просить заготовок не буду, просто попрошу объяснять мне по ходу процесса кое какие детали, вот, например, как написать функцию которая возвращает количество открытых ордеров ТОЛЬКО того или иного типа.

Рано или поздно Вам понадобится полноценная функция учёта ордеров.
Посмотрите здесь: 'Учёт ордеров в большой программе'

 

Благодарю...весьма полезная и интересная информация, но вот почему то на мой вопрос никто не желает ответить, может я неверно сформулировала его?

 
Vera писал (а) >>
И правда похожее, но не совсем. Вобщем просить заготовок не буду, просто попрошу объяснять мне по ходу процесса кое какие детали, вот, например, как написать функцию которая возвращает количество открытых ордеров ТОЛЬКО того или иного типа.

Функция NumberOfPositions().

Эта функция возвращает количество открытых в данный момент позиций. Более точный отбор подсчитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
Вот отсюда можно взять 'Полезные функции от KimIV'
Кроме того, в сосодней ветке идет эта же тема. Там я даже выложил аналог с примером использования(как раз по типу "замкА").
 
Vera писал (а) >>
...как написать функцию которая возвращает количество открытых ордеров ТОЛЬКО того или иного типа.
int TypeOrders(int type) {
   int i,cnt,num;
   
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
      if(OrderType()==type) num++;
   }
   return(num);
}
 

Рид и Талекс, приношу огромную благодарность, это то что нужно. Если возможно, я буду продолжать консультироваться у вас в данной ветке. Заранее спасибо )))

 

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

extern double Lots=0.1;
extern int TakeProfit=16;
extern int StopLoss=24;
extern int Enter=8;

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) kp++;
}
}
}
}
}
return(kp);
}

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double mSL=Ask-StopLoss*Point; // рыночные уровни
double mTP=Ask+TakeProfit*Point; // стопа и профита

double ent_sell=OrderOpenPrice()-Enter*Point; // уровень входа для первого отложника
double osSL=OrderTakeProfit(); // и уровни стопа и профита
double osTP=OrderStopLoss(); // для него

double ent_buy=OrderOpenPrice()+Enter*Point; // уровень входа для второго отложника
double obSL=OrderTakeProfit(); // и уровни стопа и профита для
double obTP=OrderStopLoss(); // него

double ent_sell2=OrderOpenPrice()-Enter*Point; // уровень входа для второго короткого
double os1SL=OrderTakeProfit();
double os1TP=OrderStopLoss();



int tic1, tic2,tic3,tic4;
double tic1op;

if(OrdersTotal()==0)
tic1=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,mSL,mTP,"",111,0,CLR_NONE);
if((NumberOfPositions()==1)&&(OrdersTotal()==1))
tic2=OrderSend(Symbol(),OP_SELLSTOP,2*Lots,ent_sell,3,osSL,osTP,"",222,0,CLR_NONE);


for(int a=4;a<Bars;a*=2){
if(NumberOfPositions()==OrdersTotal()){
tic3=OrderSend(Symbol(),OP_BUYSTOP,a*Lots,ent_buy,3,obSL,os1TP,"",333,0,CLR_NONE);
}
if(tic3<0)
Print("orders error",GetLastError());
if(NumberOfPositions()==0)break;else {continue;}
}

return(0);
}

Заранее благодарю!

Причина обращения: