Простой безиндикаторный советник, рассчитанный не столь на прибыльность, сколь на возврат спреда и (или) комиссии. Пишем сами.

Пока работал над совершенствованием идеи от Шамана, возникла своя другая идейка. Простейший советник. Прибыльность небольшая, зато сделок немеряно. А это радость брокера, которой он ну очень хочет поделиться. При этом не задает вопросы: — А че так много зарабатываешь? Палки в колеса не сует. А мне то че надо? Куплю жене сапоги. Все довольны. Пляшут.

Суть идеи: открываем как-то (подумаем как!) сделки. Как только они вышли на минимальную прибыль (задаем), то выключаем свет и… заново в поход за минимальной прибылью. Сделок много — прибыль минимальная и не вызывает беспокойства брокера. Думает себе: — Во лох… Штуку баксов целый месяц крутил, а заработал тридцать Серебренников. А по Rebate мы можем без напряга баксов двести получать. 20% в месяц! Каждому, Карл!!!
  • +5
  • Просмотров: 1878
  • 27 мая 2024, 12:16
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

  Предыдущая запись в моем блоге
Шаман. Уходят лучшие.
07 апреля 2024

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

+
0
Напомню: текущий Эквити показывает нам, сколько манейS останется на депозите, если мы все закроем, выключив таки свет.

Открытие ордеров. Серьезная штука.
Тестирование — не менее серьезная штука.
Предлагаю сложить серьезности не деля на два.

Например. TF М5. Свеча закрылась вверх. Открываем ордер Buy. Следующая закрылась вверх — OP_BUY. Закрылась вниз — Sell. А покупки, например, закрыли.

Что мы имеем?
Каждые пять минут ордер. Умножили на килограммы — сумасшедшие деньги. НО…
Мы можем тестировать по ценам открытия. Быстро, а итог, что по тикам.

Идея в моем понимании не плохая, но надо над ММ подумать. Сейчас или в ходе первых тестирований. Тут важно не набрать много ордеров. Чтоб до цугундера в виде кочерги не добаловать.

Как тебе такое, дорогой Илан?
Редактирован: 27 мая 2024, 13:49
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 27 мая 2024, 13:47
+
0
Давно ищу такого)))) но еще не нашел))) либо баланс нужен просто гигантский в центах либо слива))
avatar

  5  Ramboo Сообщений: 89 - Ram

  • 27 мая 2024, 14:29
+
0
мартингейл до добра не доведет
avatar

  5  Ramboo Сообщений: 89 - Ram

  • 27 мая 2024, 14:29
+
0
А зачем Мартин? Сорок ордеров по 0.01 — это всего 0.40 лота.
Редактирован: 27 мая 2024, 15:54
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 27 мая 2024, 15:53
+
0
Блин, кажись комп издох. Тестер не тестирует. Даже старье. Перезагрузил терминал. Пофиг. НАКИДАЛ ПРОСТЕНЬКИЙ. проверить не могу. ВРОДЕ ПО ЭНШУЮ. Первые тесты по ценам открытия были один в один с тестами по тикам.

Пробуйте, а я пока займусь компом.

Удачи.

//+------------------------------------------------------------------+
//|                                                   KAE Rebate.mq4 |
//|                                            kvashnin007@gmail.com |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
//---
input ENUM_TIMEFRAMES TF                  = PERIOD_CURRENT; // Тайм Фрейм для свечей. 0-текущий чарта.
input double          ProfitClose         = 0.3;            // Минимальный профит ($) для закрытия ордеров. 
input int             MaxOrdersLimit      = 7;              // Close Limit - функция оставляет к-во ордеров в каждом направлении.
//---      
input double          Risk                = 0.5;            // Авто лот, 0- выкл.
input double          MaximalLots         = 2.56;           // Maximal Lot 
//---
input int             MagicNumber         = 1961;           // Magic Number 
input int             Slippage            = 30;             // Slippage (in pips)
//---
datetime last_open=0;    
double   op,lt,tp;
int      tk,b,s;
int      iB=0;
double   FullBU,BuyBU,SelBU,StartLots, pr=0;
double   StepLot, lot;
int      BuyPriceMaxTic,BuyPriceMinTic,SelPriceMaxTic,SelPriceMinTic,CountHist=0;
double   BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
         SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;
double   StopEquity=0, OldEquity=0, Equity, AE, AB;
double   OldFreeMarg=0, FreeMarg;
double   OldLasso=0;
double   BuyLotsSum,SelLotsSum,WeighBuy,WeighSell;
double   open, close, high, low;
string   symb;  
int      LastCloseType;
double   LastCloseLot, LastCloseProfit;
//+------------------------------------------------------------------+
int OnInit()
{
   	last_open = iTime(NULL,TF,1);
   	symb      = Symbol();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 27 мая 2024, 22:15
+
0
Вторая часть для склейки.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   	if (last_open>=iTime(NULL, TF, 0)) 
   	   return; 
   	else
   	   {
         TradeMap();
                        
         if (pr>ProfitClose)                                     
            CloseAll();
         //---   
         if(b>MaxOrdersLimit)
            if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue)) 
         if(s>MaxOrdersLimit)
            if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed)) 
         //---   
   	   open  = iOpen (symb,TF,1);
   	   close = iClose(symb,TF,1);
   	   high  = iHigh (symb,TF,1);
   	   low   = iLow  (symb,TF,1);
   	   
   	   if (close>open)
   	      PutOrder(OP_BUY);
   	   if (close<open)
   	      PutOrder(OP_SELL);
   	   if (close==open)
   	      {
   	      if (high-open > open-low)
      	      PutOrder(OP_SELL);
   	      if (high-open < open-low)
      	      PutOrder(OP_BUY);
   	      }
   	   last_open=iTime(NULL, TF, 0);
   	   }
}
//+------------------------------------------------------------------+
//|       Function                                                   |
//+------------------------------------------------------------------+
bool PutOrder(int dir)
{
   	op  = NP((dir==OP_BUY)?Ask:Bid); // цена открытия
      lot = AccountFreeMargin()*Risk/100/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      //-------------------------------------------------------------//
      if(lot>MaximalLots)      
         lot=MaximalLots;
      
      lot=NL(lot);
      
      if(!ValidLot(lot))
         return(false);
      //-------------------------------------------------------------//
     	int ticket = OrderSend(Symbol(), dir, lot, op, int(Slippage), 0, 0, NULL, MagicNumber);
   	
   	if (ticket<=0) 
   	   { 
   	   Print("OrderSend "+Symbol()+" lot="+DoubleToString(lot, 2)+"  error "+string(GetLastError())); 
   	   return(false);      // выходим при ошибке
   	   }
   	return(true);
}
//+------------------------------------------------------------------+
bool ValidLot(double volume)
{
      //--- минимально допустимый объем для торговых операций
      double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
      if(volume<min_volume)
         return(false);
   
      //--- максимально допустимый объем для торговых операций
      double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
      if(volume>max_volume)
         return(false);
   
      //--- получим минимальную градацию объема
      double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
   
      int ratio=(int)MathRound(volume/volume_step);
      if(MathAbs(ratio*volume_step-volume)>0.0000001)
         return(false);
   
   return(true);
}

//+------------------------------------------------------------------+
bool CloseAll()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderProfit()>0)
                 {
                 if(OrderType()==OP_BUY)
                   if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                     Sleep(500);
                 if(OrderType()==OP_SELL)
                   if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                     Sleep(500);
                 }
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
//               if(OrderProfit()<=0)
                    {
                    if(OrderType()==OP_BUY)
                      if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                        Sleep(500);
                    if(OrderType()==OP_SELL)
                      if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                        Sleep(500);
                    }
   return true;
}
//+------------------------------------------------------------------+
double NP(double d) { double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); if (TickSize==0) TickSize=1; return ND(MathRound(d/TickSize)*TickSize); }
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
double NL(double _lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, _lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
void TradeMap()
{
      BuyPriceMax=0;BuyPriceMin=0;BuyPriceMaxLot=0;BuyPriceMinLot=0;
      SelPriceMin=0;SelPriceMax=0;SelPriceMinLot=0;SelPriceMaxLot=0;
      BuyPriceMaxTic=0;BuyPriceMinTic=0;SelPriceMaxTic=0;SelPriceMinTic=0;
      BuyLotsSum=0;SelLotsSum=0;WeighBuy=0;WeighSell=0;
      op=0;lt=0;tp=0;pr=0;
      BuyBU=0;SelBU=0;FullBU=0;
      tk=0;b=0;s=0;
      
      for(int i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())
                 {
                  op=NormalizeDouble(OrderOpenPrice(),Digits());
                  lt=NormalizeDouble(OrderLots(),2);
                  tk=OrderTicket();
                  
                  pr += OrderProfit() + OrderCommission() + OrderSwap();

                  if(OrderType()==OP_BUY)
                    {
                     b++;
                     BuyLotsSum += lt;
                     WeighBuy   += lt*op;
                     
                     if(op>BuyPriceMax || BuyPriceMax==0)
                       {
                        BuyPriceMax    = op;
                        BuyPriceMaxLot = lt;
                        BuyPriceMaxTic = tk;
                       }
                     if(op<BuyPriceMin || BuyPriceMin==0)
                       {
                        BuyPriceMin    = op;
                        BuyPriceMinLot = lt;
                        BuyPriceMinTic = tk;
                       }
                    }
                  // ===
                  if(OrderType()==OP_SELL)
                    {
                     s++;
                     SelLotsSum += lt;
                     WeighSell  += lt*op;
                     
                     if(op>SelPriceMax || SelPriceMax==0)
                       {
                        SelPriceMax    = op;
                        SelPriceMaxLot = lt;
                        SelPriceMaxTic = tk;
                       }
                     if(op<SelPriceMin || SelPriceMin==0)
                       {
                        SelPriceMin    = op;
                        SelPriceMinLot = lt;
                        SelPriceMinTic = tk;
                       }
                    }
                 }
              //---
              if (BuyLotsSum - SelLotsSum != 0) 
                 FullBU = (WeighBuy - WeighSell)/(BuyLotsSum - SelLotsSum);
}
//+------------------------------------------------------------------+
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 27 мая 2024, 22:17
+
0
У меня почему-то красивый слив, какие только настройки не ставил(
avatar

  5  evgsergej Сообщений: 17

  • 16 июня 2024, 18:41
+
0
А сделки то туда сюда?
У меня работает в плюс, но график рваный и не красивый. Опять же просадка.
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 20 июня 2024, 17:43
+
0
Знатоки, кто таки знает: почему не открываются продажи?
Мозг сломался. Никаких новых идей.
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 16 июня 2024, 01:59
+
0
Потому что у вас прописано: тип операции покупки
op = NP((dir==OP_BUY)


Поэтому только покупки открываются.
Редактирован: 16 июня 2024, 09:32
avatar

  19  alex30774 Сообщений: 722

  • 16 июня 2024, 09:27
+
0
Вы имеете ввиду: op=NP((type==OP_BUY)?Ask:Bid);?

Так все правильно.
Расшифровка: ор равно нормализованному значению
Если type==OP_BUY, то Ask,
а иначе Bid.-
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 16 июня 2024, 10:22
+
0
Заменил на:
if(type==OP_BUY) op=Ask; // цена открытия
if(type==OP_SELL) op=Bid; // цена открытия
op = NP(op);


Похрен.
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 16 июня 2024, 10:46
+
0
1.Функцию PutOrder вообще не надо было редактировать, а просто взять готовую у АМ2

Вот например:
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+

А дальше в функции OnTick прописываете отдельно два условия: одно для открытия сделок на покупку, одно для условия сделок на продажу
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Условие для покупок)
{
PutOrder(0,Ask);
}
else
if(Условие для продаж)
{
PutOrder(1,Bid);
}
}
//+------------------------------------------------------------------+


Или для вас принципиально, чтобы функция PutOrder у вас была своя.

Так я вам открою маленкую тайну: ни ваша, ни функция АМ2 не предназначена для торговли на реальном счёте(время от времени советник будет пропускать сигналы на вход(это я про реальный счёт говорю), пускай даже в тестере вы подберёте практически граальные настройки, на реале пара пропущенных сделок могут очень сильго сократить прибыль), так как в функции нет проверок.

Поэтому не мучайтесь: ни чего у вас не выйдет.
Ни кто не выложил в свободный доступ подобную функцию.
Игорь Ким выкладывал в 2008 году, но она сильно морально устарела(время от времени тоже пропускает входы).
Правда не так часто как функция PutOrder.Это я про упращённый вариант функции(на котором вы пытаетесь написать советник).
У АМ2 есть функция улучшеный вариант функции PutOrder (для торговли на реальном счёте)но этот вариант тоже время от времени пропускает сделки.
Редактирован: 16 июня 2024, 12:57
avatar

  19  alex30774 Сообщений: 722

  • 16 июня 2024, 12:50
+
0
Спасибо за реакцию. Но…
Начнем с того, что я ничего не редактировал. функция взята из другого рабочего советника. Добавлен подсчет лота. Но он одинаков для покупок и продаж. Ошибка не здесь. А все остальное, смотрю, как и у АМ2.
Далее: не люблю излишеств. У Андрея PutOrder(0,Ask). Если тип ==0, то и коню понятно, что OP_BUY открывается по цене Ask. Кроме того тип=0, это тоже самое, что и тип=OP_BUY. А читается лучше. Вот если нас интересуют все открытые ордера, тогда я бы тоже написал if(type<2). И вообще ничего сложного, типа проверок, я не писал. В принципе. один в один как у АМ2. А падла не открывает. Это либо лаг терминала, либо… не пойму.
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 20 июня 2024, 11:27
+
0
Цена open меняется только в случае, когда выполняются все условия которые там «НАРИСОВАНЫ» перед получением цены open ))), (так вот там ТАК написано). Потом там какая-то непонятная цена open сравнивается с close, получается что close больше, поэтому БАЙ ))). Остальные цены меняются по новому бару)). В этом есть вся проблема )).
if (b > MaxOrdersLimit)
{
  if (OrderClose(BuyPriceMaxTic, BuyPriceMaxLot, Bid, Slippage, clrBlue))
  {
            
  }
}
if (s > MaxOrdersLimit)
{
  if (OrderClose(SelPriceMinTic, SelPriceMinLot, Ask, Slippage, clrRed))
  {
            
  }
}


Для примера.
Редактирован: 21 июня 2024, 15:07
avatar

  4  MT45PRO Сообщений: 10

  • 21 июня 2024, 01:25
+
0
Спасибо за ответ.
Правда не понял. Свеча закрылась вверх — решение открыть бай. По Аsk естественно. Это то же, что вы посмотрели куда свеча закрылась и лапками открыли ордер OP_BUY или OP_SELL.

А код, что вы показали, вообще не имеет отношения к открытию ордеров. Просто закрытие дальних лишних ордеров.

Поэтому и не понимаю вашу мысль.
Редактирован: 21 июня 2024, 20:04
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 21 июня 2024, 20:02
+
0
Возможно, вы имеете ввиду, что не выполняются условия спавнения цен открытия-закрытия, так это обычная практика.

Пробовал я менять код на:

<code>/*   	   open  = iOpen (symb,PERIOD_CURRENT,1);
   	   close = iClose(symb,PERIOD_CURRENT,1);
   	   high  = iHigh (symb,PERIOD_CURRENT,1);
   	   low   = iLow  (symb,PERIOD_CURRENT,1);
*/   	   
   	   open  = Open [1];
   	   close = Close[1];
   	   high  = High [1];
   	   low   = Low  [1];
</code>

Итог тот же. Только второй вариант быстрее.

Все равно спасибо.
Редактирован: 21 июня 2024, 20:11
avatar

  7  kvashnin007 Автор Сообщений: 595 - Андрей

  • 21 июня 2024, 20:10
+
0
if(b>MaxOrdersLimit)
  if(OrderClose (BuyPriceMaxTic, BuyPriceMaxLot, Bid , Slippage, clrBlue))
    if(s>MaxOrdersLimit)
      if(OrderClose (SelPriceMinTic, SelPriceMinLot, Ask , Slippage, clrRed))
        open = iOpen (symb,TF,1);

close = iClose(symb,TF,1);
high  = iHigh (symb,TF,1);
low   = iLow  (symb,TF,1);

Фигурные скобки надо поставить так, как я указал для примера. Или вообще удалить часть выделенную в коде //---
Редактирован: 21 июня 2024, 23:39
avatar

  4  MT45PRO Сообщений: 10

  • 21 июня 2024, 20:16

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