droba
Droba

 
Уровень 7

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2089



РЕКОМЕНДУЮ



Прошу доработать цикл модификации ордеров

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

Советник прилагается.

NEW_Stochastic.mq4 (11 Kb)
  • 0
  • Просмотров: 2703
  • 18 мая 2021, 18:43
  • droba
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Еврейский танец
Следующая запись в группе  
Индикатор Candle and Volume
17 мая 2021
18 мая 2021

Комментарии (12)

+
+1
Добрый день. Советник не приложился. Перезалейте или приложите другим способом.
avatar

  18  GAWroch Сообщений: 84 - Вячеслав

  • 19 мая 2021, 17:11
+
0
//+------------------------------------------------------------------+
//| NEW_Stochastic.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| www.mql5.com |
//+------------------------------------------------------------------+
#property copyright «Copyright 2019, MetaQuotes Software Corp.»
#property link «www.mql5.com»
#property version «1.00»
#property strict
//+------------------------------------------------------------------+
//input double lot= 0.01;
input double RiskPercent = 2;
input double K_TP = 3; // Соотношение SL к ПРОФИТ
input double K_PR_B = 3; // Процент перемещения SL от ТР Buy
input double K_PR_S = 5; // Процент перемещения SL от ТР Sell
extern bool _modifi = true; // вкл. модификацию
input int magic = 20201218;

//+------------------------------------------------------------------+
//| Расчет риска в % от величины SL |
//+------------------------------------------------------------------+
double CalculateLot(double _stop) {
double loss = _stop / MarketInfo(_Symbol, MODE_TICKSIZE) * MarketInfo(_Symbol, MODE_TICKVALUE);
double lots = AccountFreeMargin() * RiskPercent / 100 / loss;
return (NormalizeDouble(MathMin(MarketInfo(_Symbol, MODE_MAXLOT), MathMax(MarketInfo(_Symbol, MODE_MINLOT), lots)), 2));
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
if(OrderType()==type || type==-1)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (_modifi)
{ _Modifi();
}

int r=0;
double stoch_1=iStochastic(_Symbol, _Period,21,2,3,MODE_SMA,1,MODE_MAIN,1);
double stoch_2=iStochastic(_Symbol, _Period,21,2,3,MODE_SMA,1,MODE_MAIN,2);
double ATR=NormalizeDouble(iATR(NULL,PERIOD_D1,21,1), Digits);
double TP=ATR*100000;
CountOrders();
if(stoch_1 > 20 && stoch_2 < 20 && NormalizeDouble(iHigh(Symbol(),0,1), Digits) < Ask && CountOrders(OP_BUY) < 1) {
r = OrderSend(Symbol(),
OP_BUY,
//NormalizeDouble(lot, 2),
CalculateLot(Ask — (NormalizeDouble(Ask — 0.3*TP*Point, Digits))),
Ask,
30,
/*NormalizeDouble(Ask — 0.3*TP*Point, Digits)*/0, //SL
NormalizeDouble(Ask + K_TP*TP*Point, Digits), //TP
«STOCHASTIC»,
magic,
0,
Blue); // BUY
}
else if(stoch_1 < 80 && stoch_2 > 80 && NormalizeDouble(iLow(Symbol(),0,1), Digits) > Bid && CountOrders(OP_SELL) < 1) {
r = OrderSend(Symbol(),
OP_SELL,
//NormalizeDouble(lot, 2),
CalculateLot((NormalizeDouble(Bid + 0.3*TP*Point, Digits)) — Bid),
Bid,
30,
/* NormalizeDouble(Bid + 0.3*TP*Point, Digits)*/0, //SL
NormalizeDouble(Bid — K_TP*TP*Point, Digits), //TP
«STOCHASTIC»,
magic,
0,
Red); // SELL
}
}
//+------------------------------------------------------------------+
void _Modifi(){
int i;
bool m;
double _profitByu=0.0, _profitSell=0.0;
for (i=OrdersHistoryTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if (OrderType()==OP_BUY && OrderProfit()>0)
if (OrderProfit()>0) _profitByu += NormalizeDouble(OrderProfit()*Point*K_PR_S,Digits);
if (OrderProfit() < 0) _profitByu = 0;
if (OrderType()==OP_SELL && OrderProfit()>0)
if (OrderProfit()>0) _profitSell += NormalizeDouble(OrderProfit()*Point*K_PR_B,Digits);
if (OrderProfit() < 0) _profitSell = 0;
{
Comment(«Посчитаем профит:» ,"\n",«Buy = »,_profitByu,
" Sell = ", _profitSell);
}
for (i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS)){
if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic){

if (OrderType()==OP_BUY && _profitSell > 0){
m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
NormalizeDouble(OrderOpenPrice()-_profitSell ,Digits),OrderExpiration(),CLR_NONE);
}
if (OrderType()==OP_SELL && _profitByu > 0){
m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
NormalizeDouble(OrderOpenPrice()+_profitByu ,Digits),OrderExpiration(),CLR_NONE);
}
}
}
}
}
}
return;
}
avatar

  7  droba Автор Сообщений: 217 - Droba

  • 20 мая 2021, 05:14
+
0
Поправил вложение в топике
avatar

  45  Bishop Сообщений: 5720 - АЛЬФАХАМЕЦ-Машковод

  • 22 мая 2021, 12:43
+
0
лучше напишите простое тз с нужной функцией. я не люблю копаться в чужом коде
avatar

  34  AM2 Сообщений: 15887 - Андрей

  • 19 мая 2021, 22:53
+
0
www.opentraders.ru/downloads/3002/ — это Ваш советник на пробой предыдущей свечи.
К нему нужно добавить модификацию ордеров. Как пример, в рынке два разнонаправленных ордера (без SL) один закрывается по ТП, а другой модифицируется, т.е. ТП переносится в отрицательную зону на 30% от прибыли закрывшегося ордера и цикл работает до тех пор пока не закроется убыточный ордер. Скажем так BUY мы модифицируем с отрицательным ТП, а SELL открывается снова после закрытия по ТП. В общем смысл стратегии — сначала забираем прибыль, а потом рассчитываем SL от этой прибыли в размере 30%. Процент вынести в переменные советника.
avatar

  7  droba Автор Сообщений: 217 - Droba

  • 20 мая 2021, 05:32
+
0
Оживил прилагаемый вами код. Вроде смысл стратегии понятен но, она не сработает. Система загонит разнонаправленные ордера в крайние точки ценового диапазона и… всё. Или я не прав?;) 
avatar

  18  GAWroch Сообщений: 84 - Вячеслав

  • 20 мая 2021, 08:28
+
0
Да так оно и будет они разбегаются по крайним точкам ценового диапазона. Там будем думать дальше.
А исходник можно?
Редактирован: 20 мая 2021, 08:36
avatar

  7  droba Автор Сообщений: 217 - Droba

  • 20 мая 2021, 08:35
+
0
Исходник чего? *???* Я оживил только прилагаемый Вами код...., ну немножко поизвращался над ним.:D 
Редактирован: 20 мая 2021, 08:56
avatar

  18  GAWroch Сообщений: 84 - Вячеслав

  • 20 мая 2021, 08:51
+
0
Оживлённого кода.
А вот торговля по этой системе, ордера открывает советник, модификация в ручную.

История с 14 мая до сегодняшнего дня.
Редактирован: 20 мая 2021, 09:22
avatar

  7  droba Автор Сообщений: 217 - Droba

  • 20 мая 2021, 09:18
+
0
Да не вопрос!
Всё в первоначальном виде… вроде.
<code>//+------------------------------------------------------------------+
//|                                               NEW_Stochastic.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//input double lot= 0.01;
input double RiskPercent = 2;
input double K_TP = 3; // Соотношение SL к ПРОФИТ
input double K_PR_B = 3; // Процент перемещения SL от ТР Buy
input double K_PR_S = 5; // Процент перемещения SL от ТР Sell
extern bool _modifi = true; // вкл. модификацию
input int magic = 20201218;
extern int    KPeriod               =  28;
extern int    DPeriod               =  10;
extern int    Slowing               =  6;
//------------------------------------------------


//+------------------------------------------------------------------+
//| Расчет риска в % от величины SL                                  |
//+------------------------------------------------------------------+
double CalculateLot(double _stop)
  {
   double loss = _stop / MarketInfo(_Symbol, MODE_TICKSIZE) * MarketInfo(_Symbol, MODE_TICKVALUE);
   double lots = AccountFreeMargin() * RiskPercent / 100 / loss;
   return (NormalizeDouble(MathMin(MarketInfo(_Symbol, MODE_MAXLOT), MathMax(MarketInfo(_Symbol, MODE_MINLOT), lots)), 2));
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
           {
            if(OrderType()==type || type==-1)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(_modifi)
     {
      _Modifi();
     }

   int r=0;
   double stoch_1=iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,1,MODE_MAIN,1);
   double stoch_2=iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,1,MODE_MAIN,2);
   double ATR=NormalizeDouble(iATR(NULL,PERIOD_D1,21,1), Digits);
   double TP=ATR*100000;
   CountOrders();
   if(stoch_1 > 20 && stoch_2 < 20 && NormalizeDouble(iHigh(Symbol(),0,1), Digits) < Ask && CountOrders(OP_BUY) < 1)
     {
      r = OrderSend(Symbol(),
                    OP_BUY,
                    //NormalizeDouble(lot, 2),
                    CalculateLot(Ask -(NormalizeDouble(Ask - 0.3*TP*Point, Digits))),
                    Ask,
                    30,
                    /*NormalizeDouble(Ask — 0.3*TP*Point, Digits)*/0, //SL
                    NormalizeDouble(Ask + K_TP*TP*Point, Digits), //TP
                    "STOCHASTIC",
                    magic,
                    0,
                    Blue); // BUY
     }
   else
      if(stoch_1 < 80 && stoch_2 > 80 && NormalizeDouble(iLow(Symbol(),0,1), Digits) > Bid && CountOrders(OP_SELL) < 1)
        {
         r = OrderSend(Symbol(),
                       OP_SELL,
                       //NormalizeDouble(lot, 2),
                       CalculateLot((NormalizeDouble(Bid + 0.3*TP*Point, Digits)) - Bid),
                       Bid,
                       30,
                       /* NormalizeDouble(Bid + 0.3*TP*Point, Digits)*/0, //SL
                       NormalizeDouble(Bid - K_TP*TP*Point, Digits), //TP
                       "STOCHASTIC",
                       magic,
                       0,
                       Red); // SELL
        }
  }
//+------------------------------------------------------------------+
void _Modifi()
  {
   int i;
   bool m;
   double profitByu=0.0, profitSell=0.0;
   for(i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()==OP_BUY && OrderProfit()>0)
            if(OrderProfit()>0)
               profitByu += NormalizeDouble(OrderProfit()*Point*K_PR_S,Digits);
         if(OrderProfit() < 0)
            profitByu = 0;
         if(OrderType()==OP_SELL && OrderProfit()>0)
            if(OrderProfit()>0)
               profitSell += NormalizeDouble(OrderProfit()*Point*K_PR_B,Digits);
         if(OrderProfit() < 0)
            profitSell = 0;
           {
            Comment("Посчитаем профит:","\n","Buy = ",profitByu,
                    " Sell = ", profitSell);
           }
         for(i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS))
              {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
                 {

                  if(OrderType()==OP_BUY && profitSell > 0)
                    {
                     m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
                                     NormalizeDouble(OrderOpenPrice()-profitSell,Digits),OrderExpiration(),CLR_NONE);
                    }
                  if(OrderType()==OP_SELL && profitByu > 0)
                    {
                     m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),
                                     NormalizeDouble(OrderOpenPrice()+profitByu,Digits),OrderExpiration(),CLR_NONE);
                    }
                 }
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
</code>

Редактирован: 20 мая 2021, 09:25
avatar

  18  GAWroch Сообщений: 84 - Вячеслав

  • 20 мая 2021, 09:23
+
0
Дак Вы в цикле модификации ордеров так не чего и не сделали. Как он передвигал ТР один раз так и осталось.
Нужно что б он передвигал ТР у отрицательного ордера после каждого положительно закрытого ордера.
Это как тралят SL за ценой у плюсовых ордеров тут то же самое только тралим ТП у отрицательных ордеров и после того как противоложный ордер закрылся с положительным ТП.
avatar

  7  droba Автор Сообщений: 217 - Droba

  • 20 мая 2021, 16:38
+
0
Я вроде по русски написал, всё в ПЕРВОНАЧАЛЬНОМ виде. Составляйте ТЗ и Андрей закодит то, что вы хотите!
avatar

  18  GAWroch Сообщений: 84 - Вячеслав

  • 20 мая 2021, 17:02

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари