Помогите реализовать в скрипте....

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

Требуется:

Текущая цена 120.
Ставим два отложенных ордера "вручную", например BuyLimit - 100, со StopLoss - 80 и SellStop - 85, со StopLoss - 105.
Цена падает на 100 - срабатывает BuyLimit.
Цена падает на 85 - срабатывает SellStop.
Цена падает на 80 - срабатывает StopLoss для BuyLimit и в этот же момент должен установиться BuyStop - 100, со StopLoss - 80.
Цена поднимется на 100 - срабатывает BuyStop.
Цена поднимается на 105 - срабатывает StopLoss для SellStop и в этот же момент устанавливается SellStop - 85, со StopLoss - 105.


Скрипт прекращает работу после "ручного" закрытия ордеров и начинает - после "ручной" установки отложенных ордеров.


В дух словах - после закрытия ордера по стопу, должен открываться ордер на том же месте.


Или это не скрипт? :)


Спасибо.
 
Это эксперт уже. Ппоэтому либо изучайте язык, либо го в новый сервис метаквотов: Работа
 
-DENIS-:



Или это не скрипт? :)


Спасибо.
смотрите в личные сообщения
 
Я думаю возможно скриптом расставить сетку отложников.
 
это не совсем сетка, я бы даже сказал совсем НЕ сетка - это просто восстановление закрытого по стопу ордера.

Я тут почитал учебник, понял следующее:

if(условие)
{
OrderSend(Symbol(), LastClosedOrder, Lots, LastClosedOrderPrice, 3, LastClosedOrderStop, 0, Без коментариев, не понял для чего это, 0, Green);
}
но вот с условием что-то не выходит.

Как обратиться на последний закрытый ордер?
 

Путем перебора всех позиций. Примерно так:

datetime        OCT             =  0;
//..тут создать переменные для остальных характеристик выбранного ордера (позиции)
void LastOrder()
{       
        datetime oct            =  0;
        
        for ( int i = OrdersHistoryTotal() - 1; i >= 0; i -- )
        {
                if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) { Print( "OrderSelect( ", i, ", SELECT_BY_POS, MODE_HISTORY ) - Error #", GetLastError() ); continue; }
                if ( OrderSymbol() != Symbol() ) { continue; } //..только нужный символ
                if ( OrderType() > 1 ) { continue; } //..в данном случае только рыночные позиции (OP_BUY & OP_SELL)
                if ( OrderMagicNumber() != MagicNumber ) { continue; } //..если торгуете руками эту строчку убрать
                
                oct = OrderCloseTime();
                
                if ( OCT < oct )
                {
                        OCT = oct;
                        //..присваиваем значения всем нужным характеристикам
                }
        }
}
 

будет так правильно?:

datetime OCT = 0;

double

LastClosedOrder,
LastClosedOrderPrice,
LastClosedOrderStop;


void LastOrder()

{       
        datetime oct = 0;
        
        for ( int i = OrdersHistoryTotal() - 1; i >= 0; i -- )
        {
                if ( !OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) { Print( "OrderSelect( ", i, ", SELECT_BY_POS, MODE_HISTORY ) - Error #", GetLastError() ); continue; }
                if ( OrderSymbol() != Symbol() ) { continue; }          //..только нужный символ
                if ( OrderType() > 1 ) { continue; }                    //..в данном случае только рыночные позиции (OP_BUY & OP_SELL)

                oct = OrderCloseTime();
                
                if ( OCT < oct )
                {
                        OCT = oct;
                        
                        LastClosedOrder = OrderType();
                        LastClosedOrderPrice = OrderClosePrice();
                        LastClosedOrderStop = OrderStopLoss();

                }
        }
}


if(условие)
        {
                OrderSend(Symbol(), LastClosedOrder, Lots, LastClosedOrderPrice, 3, LastClosedOrderStop, 0, Без коментариев, не понял для чего это, 0, Green);
        }
 
-DENIS-:
Привет всем! На изучение программирования нет ни времени ни желания (т.к. автоматическая торговля не интересует), а вот некоторые скрипты очень даже помогают. Поэтому прошу помощи в реализации некоторых функций.

Вот здесь есть готовый советник на эту тему https://www.mql5.com/ru/code/9608, посмотрите, может подойдёт.
 

Привет профи программирования!

Я тут посидел, почитал, даже подумал... :) вот что получилось

   double
   Orders;
   
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  Orders=OrdersTotal();
//----
   if (Orders==0)                                     // Если нет отложенных ордеров...
      {
         Alert("Нет отложенных ордеров");             // ... сообщение об ошибке
      }
   if (Orders>4)                                      // Если ордеров больше допустимого...
     {
      Alert("Количество ордеров больше допустимого"); // ... сообщение об ошибке 
     }
   if (Orders<4)                                      // Если ордеров меньше допустимого..
      {
       LastOrder();                                   // .. открывается последний закрытый ордер
      }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Users function                                                   |
//+------------------------------------------------------------------+
        
    datetime OCT=0;
        
    double
    LastOrderType,
    LastOrderLots,
    LastOrderPrice,
    LastOrderStoploss;
//----
    void LastOrder()
        {
          datetime oct=0;
          for (int i=OrdersHistoryTotal()-1; i>=0; i--)
                {
                        if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
                                {
                                        Print("OrderSelect(", i, ", SELECT_BY_POS, MODE_HISTORY) - Error #", GetLastError());
                                        continue;
                                }
                        if (OrderSymbol()!=Symbol())
                                {
                                        continue;
                                }
                        oct=OrderCloseTime();
                        if (OCT<oct)
                                {
                                        OCT=oct;
                                        LastOrderType=OrderType();
                                        LastOrderLots=OrderLots();
                                        LastOrderPrice=OrderClosePrice();
                                        LastOrderStoploss=OrderStopLoss();
                                }
                }
    }
    return;

Подскажите плиз все ли тут правильно и будет ли это работать....

Спасибо

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