0
2 часть:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int type=-1)
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
        if(PositionGetString(POSITION_SYMBOL)==_Symbol)
        if(PositionGetInteger(POSITION_TYPE)==type || type==-1)
           {
            count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  //---
   double p11=iLow(NULL,PERIOD_D1,1);
   double p22=iLow(NULL,PERIOD_D1,2);
   double p33=iLow(NULL,PERIOD_D1,3);
   double p1=iHigh(NULL,PERIOD_D1,1);
   double p2=iHigh(NULL,PERIOD_D1,2);
   double p3=iHigh(NULL,PERIOD_D1,3);
   int i=0; i<=days;
   
      double p382=0,p444=0,p618=0;
      double dn=iLow(NULL,PERIOD_D1,i+1);
      double up=iHigh(NULL,PERIOD_D1,i+1);
      datetime t1=iTime(NULL,PERIOD_D1,i-1);
      datetime t2=iTime(NULL,PERIOD_D1,i);
      if(CountTrades()<1)
      if(i==0)
        {
         t1=iTime(NULL,PERIOD_D1,0);
         t2=t1+24*3600;
        }

      p382=NormalizeDouble(up-((up-dn)*0.40),_Digits);
      p444=NormalizeDouble(up-((up-dn)*0.50),_Digits);
      p618=NormalizeDouble(up-((up-dn)*0.60),_Digits);

      if(fibo)
         PutFibo("FiboDay"+" fibo "+(string)i,t1,up,t2,dn);

      PutTrendLine("FiboDay"+" dn "+(string)i,t1,dn,t2,dn,Red);
      PutTrendLine("FiboDay"+" up "+(string)i,t1,up,t2,up,Blue);

      PutRect("FiboDay"+" rect "+(string)i,t1,p382,t2,p618);
   
   double sl=0,tp=0;
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double BImbalance=iLow(NULL,PERIOD_D1,0)-iHigh(NULL,PERIOD_D1,2);
   double SImbalance=iHigh(NULL,PERIOD_D1,0)-iLow(NULL,PERIOD_D1,2);
   bool buy=Ask<p444 && p11>p22 && p22>p33 && (iHigh(_Symbol,PERIOD_D1,1)>iHigh(_Symbol,PERIOD_D1,2) && iLow(_Symbol,PERIOD_D1,1)>iLow(_Symbol,PERIOD_D1,2) && iClose(_Symbol,PERIOD_D1,1)>iClose(_Symbol,PERIOD_D1,2));
   bool sell=Bid>p444 && p1<p2 && p2<p3 && (iLow(_Symbol,PERIOD_D1,1)<iLow(_Symbol,PERIOD_D1,2) && iLow(_Symbol,PERIOD_D1,1)<iLow(_Symbol,PERIOD_D1,2) && iClose(_Symbol,PERIOD_D1,1)<iClose(_Symbol,PERIOD_D1,2));
   bool buyClose=Ask>p618 && Ask>p382;
   bool sellClose=Bid<p382 && Ask<p618;
   if(CloseSig>0)
     {
      if(sellClose)
         CloseAll(1);
      if(buyClose)
         CloseAll(0);
     }

   if(PositionsTotal()<1)
     {
      if(buy)
        {
         if(StopLoss>0)
            sl=NormalizeDouble(Bid-StopLoss*_Point,_Digits);
         if(TakeProfit>0)
            tp=NormalizeDouble(Bid+TakeProfit*_Point,_Digits);
         trade.PositionOpen(_Symbol,0,Lot(),Ask,sl,tp);
        }

      if(sell)
        {
         if(StopLoss>0)
            sl=NormalizeDouble(Ask+StopLoss*_Point,_Digits);
         if(TakeProfit>0)
            tp=NormalizeDouble(Ask-TakeProfit*_Point,_Digits);
         trade.PositionOpen(_Symbol,1,Lot(),Bid,sl,tp);
        }
     }

   Comment("\n p1: ",p1,
           "\n p2: ",p2,
           "\n 38.2: ",p2+(p1-p2)*0.382,
           "\n 50.0: ",p2+(p1-p2)*0.5,
           "\n 61.8: ",p2+(p1-p2)*0.618);
  }
//+------------------------------------------------------------------+
avatar

Shtenco

  • 27 марта 2023, 15:25
0
1 часть:

//+------------------------------------------------------------------+
//|                                                   SMARTMONEY.mq5 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"

#include <Trade\Trade.mqh>             // Подключаем торговый класс CTrade
input double Lots      = 0.1;  // лот
input double KLot      = 2;    // увеличение лота
input double MaxLot    = 5;    // максимальный лот
input int    StopLoss  = 0;    // стоплосс
input int    TakeProfit= 0;    // тейкпрофит
input int    CloseSig  = 1;    // 1-закрытие по сигналу
input int    Slip      = 100;  // проскальзывание
input int days=5;
input bool fibo=0;
input color rect=Aqua;
CTrade trade;                // Используем торговый класс CTrade
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelObject(string name)
  {
   for(int i=ObjectsTotal(0,0); i>=0; i--)
     {
      string s=ObjectName(0,i);
      if(StringFind(s,name)>=0)
         ObjectDelete(0,ObjectName(0,i));
     }
  }
//+------------------------------------------------------------------+
//| Создание объекта FIBO                                            |
//+------------------------------------------------------------------+
void PutFibo(string name,datetime t1,double p1,datetime t2,double p2)
  {
   ObjectDelete(0,name);
//--- создадим "Уровни Фибоначчи" по заданным координатам
   ObjectCreate(0,name,OBJ_FIBO,0,t1,p1,t2,p2);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,0);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutTrendLine(string name,datetime time1,double price1,datetime time2,double price2,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,0);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,rect);
//--- установим стиль линий прямоугольника
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линий прямоугольника
   ObjectSetInteger(0,name,OBJPROP_WIDTH,3);
//--- включим (true) или отключим (false) режим заливки прямоугольника
   ObjectSetInteger(0,name,OBJPROP_FILL,1);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,0);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lots=Lots;
   if(PositionsTotal()>0)
      lots=NormalizeDouble(Lots*MathPow(KLot,PositionsTotal()),2);
   return(lots);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int type=-1)
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_TYPE)==type || type==-1)
           {
            trade.PositionClose(PositionGetTicket(i));
           }
        }
     }
  }
avatar

Shtenco

  • 27 марта 2023, 15:24
0
Андрей, вы не будете писать?(
avatar

Shtenco

  • 27 марта 2023, 01:30
0
Эту функцию самому надо писать, я такое не умею)А в целом у вас задумка превосходная, получить 30-40% в год с просадкой не выше 3-4% — это тянет на Грааль!)
avatar

Shtenco

  • 25 марта 2023, 15:21
0
Вы сами опубликовали выше: if(AllProfit()>Profit || AllProfit()<-Loss)

Функции расчета убытков пока нет в МТ, и если появится то только в МТ5 скорее всего)
avatar

Shtenco

  • 25 марта 2023, 15:20
0
Интересно, неужели бывает функция OrderLoss?
avatar

Shtenco

  • 25 марта 2023, 14:46
0
avatar

Shtenco

  • 25 марта 2023, 14:38
0
Код без тэга кода, просто как комментарий, тоже не публикует… Что за ерунда…
avatar

Shtenco

  • 25 марта 2023, 14:37
0
Не получается именно в этом топике код опубликовать. Пишет что текст комментария должен быть больше 2 знаков. Хотя он и так больше. А в других топиках коды публикует…
avatar

Shtenco

  • 25 марта 2023, 14:37
0
//+------------------------------------------------------------------+
//|                                                       Simple.mq4 |
//|                                              Copyright 2023, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int TrailingStop  = 0;        // трал
extern int Step          = 333;      // шаг
extern double Profit     = 11;       // профит
extern int Slip          = 30;       // реквот
extern int Magic1        = 111;      // магик 1
extern int Magic2        = 222;      // магик 2

extern string Comm       = "Simple";

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,int mn)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,Comm,mn,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingAll()
  {
   bool mod=1;

   double all=0,count=0,sl=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic1 || OrderMagicNumber()==Magic2))
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }

   if(count>0)
      all=NormalizeDouble(all/count,_Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic1 || OrderMagicNumber()==Magic2))
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-all>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(all-Ask>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет позиций                                                  |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic1 || OrderMagicNumber()==Magic2))
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
               count++;
            if(OrderType()==1 && (ot==1 || ot==-1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int mn=0)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn)
           {
            if(OrderType()>1)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;


   return(lot);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int mn=0)
  {
   bool del=1;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn)
           {
            if(OrderType()>1)
               del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
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()==Magic1 || OrderMagicNumber()==Magic2))
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

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

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic1 || OrderMagicNumber()==Magic2)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
   if(AllProfit()>Profit && Profit>0)
      CloseAll();
      
   if(TrailingStop>0)
      TrailingAll();
      
   if(CountTrades()<1)
     {
      PutOrder(1,Bid,Magic1);
      PutOrder(0,Ask,Magic2);
     }

   if(CountOrders(Magic1)<1)
     {
      PutOrder(3,Bid+Step*_Point,Magic1);
      PutOrder(5,Bid-Step*_Point,Magic1);
     }

   if(CountOrders(Magic2)<1)
     {
      PutOrder(2,Bid-Step*_Point,Magic2);
      PutOrder(4,Bid+Step*_Point,Magic2);
     }

   if(CountOrders(Magic1)<2)
      DelOrder(Magic1);

   if(CountOrders(Magic2)<2)
      DelOrder(Magic2);

   Comment("\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+
avatar

Shtenco

  • 25 марта 2023, 14:34
0
Рекомендую все же включить функцию сбора профитов
avatar

Shtenco

  • 25 марта 2023, 14:27
0
Не получается опубликовать код, выдает что не хватает символов(
avatar

Shtenco

  • 23 марта 2023, 22:22
+1
Закодил сам систему… Не на всех парах работает к сожалению, на некоторых прямо Грааль и на реальных тиках, а на некоторых сливной(Нужно вшивать вход по имбалансу или ордер блоку, чтобы точно входил....
avatar

Shtenco

  • 23 марта 2023, 10:48
0
Удивительно что советник автора сливает а индикатор напротив отличный. Вы скорее всего старый BPNN смотрели, года 2013, он сливной, я его проверял
avatar

Shtenco

  • 23 марта 2023, 02:18
0
EURUSD — покупка на 24 бара вперед
AUDUSD — покупка на 24 бара вперед
USDJPY — продажа на 24 бара вперед
USDCHF — покупка на 24 бара вперед
GBPUSD — покупка на 24 бара вперед
USDCAD — продажа на 24 бара вперед
avatar

Shtenco

  • 18 марта 2023, 19:45
0
Да, чуть позже сделаю, на мажоры, распишу.
avatar

Shtenco

  • 18 марта 2023, 19:31
0
Понятно(Тогда лучше на нужно, не хочется плодить сливные советники:) 
avatar

Shtenco

  • 11 марта 2023, 18:27
0
Спасибо большое!:) Можно без определения тренда, просто по бай/селл лимит и бай/селл стоп с разными шагами и множителями. Это позволит действовать в моменте. На более сложные способы вроде слежения за экстремумами Андрей вряд ли подпишется за один топик, пусть хоть каркас будет)
avatar

Shtenco

  • 11 марта 2023, 05:30