0
Очевидно имелась в виду возможность торговли в двух направлениях одновременно?
avatar

GAWroch

  • 25 мая 2021, 08:49
+1
Андрей извини, что поковырялся в твоем коде. В общем такая хрень получилась. Тейк вроде «тралит» в минус, но пункты изменения привязаны к «StopLoss», а это не верно. Они должны зависеть от величины последнего профита, если я правильно понял пожелания автора. Возможно Андрей сделает? И да, за основу взят сов «HighLow4».
<code>
//+------------------------------------------------------------------+
//|                                                    HighLowXZ.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 222;      // лось
extern int TakeProfit    = 333;      // язь
extern int Count         = 2;        // число поз
extern int Delta         = 20;       // дополнение к стопу
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                   Одна  сделка за свечу                          |
//+------------------------------------------------------------------+
bool OneCandleDeal()
  {
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderOpenTime()>Time[0] && OrderOpenTime()<Time[0]+PeriodSeconds())
           {
            return(false);
           }
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int type)
  {
   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)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|         Подсчет профита по типу ордеров                          |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//------------------------------------------------------------------------

//+------------------------------------------------------------------+
//|            Автор функции подсчета профита последней              |
//|          группы закрытых ордеров"Vitalie Postolache"             |
//+------------------------------------------------------------------+
double lastloss()
  {
   double lastlos=0,op=0;
   int cnt=0;
   datetime time=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
           {
            if(cnt==0 && OrderCloseTime()!=0)
               time=OrderCloseTime();
            if(OrderCloseTime()+PeriodSeconds()<time)
               break;
            op=NormalizeDouble(OrderProfit()+OrderSwap()+OrderCommission(),2);
            lastlos+=op;
            cnt++;
           }
        }
     }
   return(lastlos);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeB()
  {
   bool m=1;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               if(OrderOpenPrice()< OrderTakeProfit())
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()-NormalizeDouble(StopLoss*_Point,_Digits),0,Yellow);
              }
              {
               if(OrderOpenPrice()> OrderTakeProfit())
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit()-NormalizeDouble(StopLoss*_Point,_Digits),0,Yellow);
              }
           }
        }
     }
  }
//--------------------------------------------------------------------------------------------------
void ModeS()
  {
   bool m=1;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==1)
              {
               if(OrderOpenPrice()> OrderTakeProfit())
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+NormalizeDouble(StopLoss*_Point,_Digits),0,Yellow);
              }
              {
               if(OrderOpenPrice()< OrderTakeProfit())
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit()+NormalizeDouble(StopLoss*_Point,_Digits),0,Yellow);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int r=0;
   if(Bid>=High[1])
     {
      if(CountTrades(0)<Count)
        {
         if(OneCandleDeal())
           {
            r=OrderSend(NULL,0,Lots,NormalizeDouble(Ask,_Digits),Slip,0,NormalizeDouble(Bid+TakeProfit*_Point,_Digits),"",Magic,0,Blue);
            if(lastloss()>0)
               ModeS();
           }
        }
     }
   if(Bid<=Low[1])
     {
      if(CountTrades(1)<Count)
        {
         if(OneCandleDeal())
           {
            r=OrderSend(NULL,1,Lots,NormalizeDouble(Bid,_Digits),Slip,0,NormalizeDouble(Ask-TakeProfit*_Point,_Digits),"",Magic,0,Red);
            if(lastloss()>0)
               ModeB();
           }
        }
     }

   Comment("\n Buy: ",CountTrades(0),
           "\n Sell: ",CountTrades(1),
           " \n",
           "\n Крайний профит:                       ",lastloss());
  }
//+------------------------------------------------------------------+

</code>
avatar

GAWroch

  • 22 мая 2021, 10:06
0
Примерно так. Двигаем ТР при каждом закрытии противоположного ордера по профиту.
avatar

GAWroch

  • 22 мая 2021, 05:57
0
Слежу за темой, интересно, что может получиться. Оперативно Андрей. Но подозреваю это не то, что хотел автор. Если его комментов не последует, в понедельник оформлю ТЗ от себя так, как я понял автора.
avatar

GAWroch

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

GAWroch

  • 20 мая 2021, 17:02
0
Ну хорошо, уговорил. Я только умничаю. Успокойся уже. Хорош флудить, правдознатец. )))
avatar

GAWroch

  • 20 мая 2021, 15:52
0
Ты не предполагай! Ты мне точно скажи! :D  Неее, отвечать не нужно. Для меня тема не интересна. Всем добра! ;) 
avatar

GAWroch

  • 20 мая 2021, 11:14
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>
avatar

GAWroch

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

GAWroch

  • 20 мая 2021, 08:51
0
Меня тоже, очень реально, интересует вопрос- в чем смысл жизни!?? И ещё- если я такой умный, почему такой бедный!?? Может тоже тему замутить, вдруг кто подскажет? :D 
avatar

GAWroch

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

GAWroch

  • 20 мая 2021, 08:28
0
Вот вы развели полемику на пустом месте! :D  Еслиб у бабушки был член, она была бы дедушкой! А если у всех бабушек? Это, примерно, суть вашего флуда. Математика — вещь, беспорно, мощная! Но грааля до сих пор нет, в свободном доступе по крайней мере. ( 
avatar

GAWroch

  • 19 мая 2021, 18:52
0
Добрый день. Такой вы хотели советник? Мартин отключаемый. www.opentraders.ru/downloads/3017/ Было свободное время накидал. Все функции Андрея, я только соавтор. :) 
avatar

GAWroch

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

GAWroch

  • 19 мая 2021, 17:11
0
Чтобы ускорить решение вопроса и сэкономить время Андрея поправил. Логика не затронута, только графика.
www.opentraders.ru/downloads/2977/
avatar

GAWroch

  • 6 апреля 2021, 07:42
0
Вы меня не обидели, конечно. Для Вас же лучше, быстрее получите желаемого советника. :) 
avatar

GAWroch

  • 1 апреля 2021, 19:55
0
Уважаемый, вы хоть немного уважения имейте к кодерам. Поясните предполагаемую логику работы советника, лучше со скринами. Андрей же не ясновидящий! Ни в коем случае не хотел Вас задеть или обидеть.
avatar

GAWroch

  • 1 апреля 2021, 19:14
0
Всё верно. Индикатор, а следовательно и сигналы, в тестере не прогоняются. Тестить только на демке. Но результат — убожество. Индикатор рисует — Пикассо отдыхает! )) Но это чисто моё мнение. ( наблюдал индикатор 3 дня на 1мин, 5 мин, 15 мин тайм фреймах)
avatar

GAWroch

  • 1 апреля 2021, 19:07
0
Ну в канун Нового года! Выступаю поручителем. ))))
avatar

GAWroch

  • 26 декабря 2020, 00:31
0
Разрешите присоединиться к поздравлениям и мне… С наступающим Андрей и все участники группы!!! *good* 
avatar

GAWroch

  • 26 декабря 2020, 00:27