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

FEEX

Местный житель
LogoForex2.jpg

Доброго времени суток.
Вопрос: как сделать такое лого?
Еще при запуске робота оно всегда появляется в центре, какой бы ширины и высоты окно графика не было.
 
Последнее редактирование:

star603

Новичок форума
даже этот ща не работает то что работало.
массив индикатор не работает сейчас а фикс работает
 

Вложения

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

Абдулхаким

Почетный гражданин
Доброго времени суток.
Доброго
как сделать такое лого?
добавь в код нужную картинку в bmp формате
C-подобный:
#resource "\\Images\\__________.bmp"
в OnInit() разложи её на точки
C-подобный:
uint BMP[];
int width, height;
ResourceReadImage("::Images\\__________.bmp",BMP,width,height);
далее этим точкам задай уровень прозрачности функцией ColorToARGB,
этим конечно не обязательно ограничиваться :),
можно например:
фон картинки сделать полностью прозрачным, а основное изображение полупрозрачным.
или заменить один цвет на другой.
в большинстве случаев для этого придётся подготовить картинку хотя бы в Paint.
далее собери получившийся массив обратно в картинку
C-подобный:
ResourceCreate("::__________",BMP,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE);
и уже это название картинки "::__________" используй дальше по коду
при запуске робота оно всегда появляется в центре, какой бы ширины и высоты окно графика не было.
функцией ChartGetInteger() получи высоту и ширину графика в пикселях (раздели их на 2 :)), а объекту с картинкой укажи точку привязки по центру
 

FEEX

Местный житель
Доброго

добавь в код нужную картинку в bmp формате
C-подобный:
#resource "\\Images\\__________.bmp"
в OnInit() разложи её на точки
C-подобный:
uint BMP[];
int width, height;
ResourceReadImage("::Images\\__________.bmp",BMP,width,height);
далее этим точкам задай уровень прозрачности функцией ColorToARGB,
этим конечно не обязательно ограничиваться :),
можно например:
фон картинки сделать полностью прозрачным, а основное изображение полупрозрачным.
или заменить один цвет на другой.
в большинстве случаев для этого придётся подготовить картинку хотя бы в Paint.
далее собери получившийся массив обратно в картинку
C-подобный:
ResourceCreate("::__________",BMP,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE);
и уже это название картинки "::__________" используй дальше по коду

функцией ChartGetInteger() получи высоту и ширину графика в пикселях (раздели их на 2 :)), а объекту с картинкой укажи точку привязки по центру
обычную картинку я могу вставить, примерно так:

Код:
#resource "Icon30.bmp"
 //-----------------------
 string Icon = "::Icon30.bmp";
 
  ObjectCreate(0,"label_object8",OBJ_BITMAP_LABEL,0,0,0);
  ObjectSetString(0,"label_object8",OBJPROP_BMPFILE,Icon);
  ObjectSetInteger(0,"label_object8", OBJPROP_XDISTANCE, 159);
  ObjectSetInteger(0,"label_object8", OBJPROP_YDISTANCE, 17);

но то, о чем Вы написали, я уже не осилю, в силу отсутствия наличия достаточных знаний)))
Не могли бы Вы какой-то собранный пример набросать(в коде) того, что описали? Я попробую осилить)
 

Абдулхаким

Почетный гражданин
Не могли бы Вы какой-то собранный пример набросать(в коде) того, что описали? Я попробую осилить)
я уже почти всё написал :)
осталось только цикл добавить
C-подобный:
for(int i=ArraySize(BMP)-1; i>=0; i--)
и перебирать там точки
C-подобный:
BMP[i] = ColorToARGB(BMP[i],99);
записать это вместе и даже без всяких проверок, дополнительных условий, чистки памяти это уже будет работать.
но то, о чем Вы написали, я уже не осилю, в силу отсутствия наличия достаточных знаний)))
я своё участие в этой ветке вижу таким какое оно есть :)
это же ветка "Ваши вопросы", а не "Сделайте за меня", потому подразумеваю, что у вас есть желание разобраться в вопросе и умение пользоваться справкой.
 
Последнее редактирование модератором:

star603

Новичок форума
Код:
double in[4][31];//Значения разных индикаторов
/********************************************************
void OnTick()
  {
   st1(fl(),sw(),ST(),PT());
  }
/********************************************************
void uo(double &gh1[4][31])
  {
   for(int j =0; j<ArrayRange(gh1,1); j++)
     {
      gh1[0][j] =High[j];//Максимальная цена
      gh1[1][j] =Low[j];//Минимальная цена
      gh1[2][j] =Open[j];//Цена открытия
      gh1[3][j] =Close[j];//Цена закрытия
     }
  }
/*************************************************
void st1(double Flot,string swop,double sl,double pt)
  {
   uo(in);
   Comment(NormalizeDouble(in[3][4],5),"=",Time[4]);
  }

Как получить значение даты для in[3][4]. При таком выдает 1970 год и т д
 

Ugar

Гуру форума
Код:
double in[4][31];//Значения разных индикаторов
/********************************************************
void OnTick()
  {
   st1(fl(),sw(),ST(),PT());
  }
/********************************************************
void uo(double &gh1[4][31])
  {
   for(int j =0; j<ArrayRange(gh1,1); j++)
     {
      gh1[0][j] =High[j];//Максимальная цена
      gh1[1][j] =Low[j];//Минимальная цена
      gh1[2][j] =Open[j];//Цена открытия
      gh1[3][j] =Close[j];//Цена закрытия
     }
  }
/*************************************************
void st1(double Flot,string swop,double sl,double pt)
  {
   uo(in);
   Comment(NormalizeDouble(in[3][4],5),"=",Time[4]);
  }

Как получить значение даты для in[3][4]. При таком выдает 1970 год и т д
Нужно преобразовывать время в строку TimeToString
 

star603

Новичок форума
Код:
enum stopi
  {
   t0,// Без стопов
   t1,//Фиксированные стопы
   t2//Минимальные стопы
  };
enum profiti
  {
   n0,//Без профитов
   n1,//Фиксированные профиты
   n2//Минимальные профиты
  };
/********************************************
sinput stopi Stop = 0;//Способ установки стопов
sinput profiti Profit = 0;//Способ установки профитов
/***********************************************
void OnTick()
  {
   if(OrdersTotal()==0)
      st1(fl(),sw(),ST(),PT());
  }
/**********************************************
double ST()
  {
   double sl =0.0;
   int Magic =456789;
   uy(fiks);
   switch(Stop)//enum список
     {
      case 0://Торгуем без стопов
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        Print("NO");
                        break;
                     case 1:
                        Print("no");
                        break;
                    }
                 }
              }
           }
         break;
      case 1://Фиксированные стопы
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        sl=fiks[10];
                        break;
                     case 1:
                        sl=fiks[11];
                        break;
                    }
                 }
              }
           }
         break;
      case 2://Минимальные стопы
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        sl=fiks[12];
                        break;
                     case 1:
                        sl=fiks[13];
                        break;
                    }
                 }
              }
           }
         break;
     }
   return(sl);
  }
//+------------------------------------------------------------------+
double PT()
  {
   double pt =0.0;
   int Magic =456789;
   uy(fiks);
   switch(Profit)//enum список
     {
      case 0://Торгуем без стопов
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        Print("NO2");
                        break;
                     case 1:
                        Print("no2");
                        break;
                    }
                 }
              }
           }
         break;
      case 1://Фиксированные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[14];
                        break;
                     case 1:
                        pt=fiks[15];
                        break;
                    }
                 }
              }
           }
         break;
      case 2://Минимальные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[16];
                        break;
                     case 1:
                        pt=fiks[17];
                        break;
                    }
                 }
              }
           }
         break;
     }
   return(pt);
  }
//+------------------------------------------------------------------+
void OrderModifi(double sl,double pt)
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      int ticketss;
      int Magic = 456789;
      uy(fiks);
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>sl && OrderStopLoss()!= sl) || (OrderOpenPrice()<pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<sl && OrderStopLoss()!= sl) || (OrderOpenPrice()>pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void st1(double Flot,string swop,double sl,double pt)
  {
   uo(in);
   int ticketss;
   if(in[1][1]>in[1][2])
     {
      ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
   else
      if(in[1][1]<in[1][2])
        {
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",456789,clrNONE);
         OrderModifi(ST(),PT());
        }
  }
//+------------------------------------------------------------------+

Не понимаю почему только с помощью этой строки происходит модернизация ордеров
Код:
OrderModifi(ST(),PT());

без нее из менения стопв и профитов не происходит хотя в функции st1 уже ессть ST() и PT()
 

Ugar

Гуру форума
Код:
enum stopi
  {
   t0,// Без стопов
   t1,//Фиксированные стопы
   t2//Минимальные стопы
  };
enum profiti
  {
   n0,//Без профитов
   n1,//Фиксированные профиты
   n2//Минимальные профиты
  };
/********************************************
sinput stopi Stop = 0;//Способ установки стопов
sinput profiti Profit = 0;//Способ установки профитов
/***********************************************
void OnTick()
  {
   if(OrdersTotal()==0)
      st1(fl(),sw(),ST(),PT());
  }
/**********************************************
double ST()
  {
   double sl =0.0;
   int Magic =456789;
   uy(fiks);
   switch(Stop)//enum список
     {
      case 0://Торгуем без стопов
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        Print("NO");
                        break;
                     case 1:
                        Print("no");
                        break;
                    }
                 }
              }
           }
         break;
      case 1://Фиксированные стопы
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        sl=fiks[10];
                        break;
                     case 1:
                        sl=fiks[11];
                        break;
                    }
                 }
              }
           }
         break;
      case 2://Минимальные стопы
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        sl=fiks[12];
                        break;
                     case 1:
                        sl=fiks[13];
                        break;
                    }
                 }
              }
           }
         break;
     }
   return(sl);
  }
//+------------------------------------------------------------------+
double PT()
  {
   double pt =0.0;
   int Magic =456789;
   uy(fiks);
   switch(Profit)//enum список
     {
      case 0://Торгуем без стопов
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        Print("NO2");
                        break;
                     case 1:
                        Print("no2");
                        break;
                    }
                 }
              }
           }
         break;
      case 1://Фиксированные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[14];
                        break;
                     case 1:
                        pt=fiks[15];
                        break;
                    }
                 }
              }
           }
         break;
      case 2://Минимальные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[16];
                        break;
                     case 1:
                        pt=fiks[17];
                        break;
                    }
                 }
              }
           }
         break;
     }
   return(pt);
  }
//+------------------------------------------------------------------+
void OrderModifi(double sl,double pt)
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      int ticketss;
      int Magic = 456789;
      uy(fiks);
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>sl && OrderStopLoss()!= sl) || (OrderOpenPrice()<pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<sl && OrderStopLoss()!= sl) || (OrderOpenPrice()>pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void st1(double Flot,string swop,double sl,double pt)
  {
   uo(in);
   int ticketss;
   if(in[1][1]>in[1][2])
     {
      ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
   else
      if(in[1][1]<in[1][2])
        {
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",456789,clrNONE);
         OrderModifi(ST(),PT());
        }
  }
//+------------------------------------------------------------------+

Не понимаю почему только с помощью этой строки происходит модернизация ордеров
Код:
OrderModifi(ST(),PT());

без нее из менения стопв и профитов не происходит хотя в функции st1 уже ессть ST() и PT()
Потому что модификацию ордеров выполняет функция OrderModify().
 

star603

Новичок форума
Как сделать чтобы получать случайное число в заданных пределах и определенного типа?
 

Ugar

Гуру форума
Как сделать чтобы получать случайное число в заданных пределах и определенного типа?
Генератор псевдослучайных чисел MathRand(). Генерирует в диапазоне 0-32768. Подогнать этот диапазон под нужный простая математика.
Перед использованием лучше инициализировать его чем то случайным или уникальным функцией MathSranf(...). В справочнике описано достаточно подробно.
 

star603

Новичок форума
Почему показывает ордеров 0 хотя селл 1 есть.
Не работает на определенном часу
И на определенном баре
Прошу дать подсказки
 

Вложения

star603

Новичок форума
Код:
void OnTick()
  {
   st1(fl(),sw(),ST(),PT());
  }
double fl()
  {
   uy(fiks);
   double Flot = 0.0;
   int Magic =456789;
   switch(LOT)
     {
      case 0://Фиксированный лот
         Flot = fiks[0];
         break;
      case 1://Иходя из баланса
         Flot = NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
         break;
      case 2://Иходя из Эквити
         Flot = NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
         break;
      case 3://Иходя из риска
         Flot = NormalizeDouble((AccountFreeMargin()*fiks[1])/1000,2);
         break;
      case 4:
         for(int i=0; i<=OrdersTotal(); i++)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
              {
               double profit=OrderProfit()+OrderCommission()+OrderSwap();
               if(profit>0.00001)
                  Flot = OrderLots()+0.01;
               else
                  if(profit< -0.00001)
                     Flot = 0.01;
              }
           }
         break;
     }
   return(Flot);
  }
 void OrderModifi(double sl,double pt)
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      int ticketss;
      int Magic = 456789;
      uy(fiks);
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>sl && OrderStopLoss()!= sl) || (OrderOpenPrice()<pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<sl && OrderStopLoss()!= sl) || (OrderOpenPrice()>pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
  void st1(double Flot,string swop,double sl,double pt)
  {
   uo(in);
   int ticketss;
   if(in[1][1]>in[1][2])
     {
      Print("Lot=",NormalizeDouble(Flot,8));
      ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
   if(in[1][1]<in[1][2])
     {
      Print("Lot1=",NormalizeDouble(Flot,8));
      ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
   if(in[0][1]<in[0][2])
     {
      Print("Lot2=",NormalizeDouble(Flot,8));
      ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
   if(in[0][1]>in[0][2])
     {
      Print("Lot3=",NormalizeDouble(Flot,8));
      ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",456789,clrNONE);
      OrderModifi(ST(),PT());
     }
  }

Не работает увеличение согласно прогрессии
 

star603

Новичок форума
Код:
void OnTick()
  {   
   Comment(CountBars());
  }
  //***********************************
  int CountBars()
  {
   datetime newbar =0;
   int cnt = 0;
   if(newbar!=Time[0])
     {
      newbar=Time[0];
      cnt++;
     }
   return(cnt);
  }
 
  Почему считает до 1?
 

star603

Новичок форума
Код:
void OnTick()
  { 
   Comment(CountBars());
  }
  //***********************************
  int CountBars()
  {
   datetime newbar =0;
   int cnt = 0;
   if(newbar!=Time[0])
     {
      newbar=Time[0];
      cnt++;
     }
   return(cnt);
  }
 
  Почему считает до 1?
Код:
int CountBars()
  {
   datetime newbar =0;
   int cnt = 0;
   for(cnt =0; cnt>=Bars; cnt++)
     {
      if(newbar!=Time[0])
        {
         newbar=Time[0];
         cnt++;
        }
     }
   return(cnt);
  }

счет идет но с 1002 пара GBP/CHF 2004-2022(период теста)
 
Последнее редактирование:

Denis181986

Активный участник
Коллеги подскажите как убрать один отложенный ордер при активации второго . Изначально две отложки , при активации одной убрать вторую
 

ssg

Интересующийся
Рассуждайте логически. Всё просто.
1. Старт. Выставлены два противоположенных ордера.
2. Один из ордеров срабатывает и вместо ордера открывается позиция.
3.Теперь есть одна открытая позиция и один отложенный ордер.
4. Перебираете наличие открытых позиций.
5. Если есть открытая позиция - тогда удалить ордер.
 

Смотрят сейчас (4) Посмотреть

Отслеживают (500) Посмотреть

Верх