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

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

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

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

Брокер для ваших роботов, 15 лет на рынке

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

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

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

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

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

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

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

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

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

  6  Ramboo Сообщений: 94 - Ram

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

  6  Ramboo Сообщений: 94 - Ram

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

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

  • 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

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

  • 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

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

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

  8  evgsergej Сообщений: 27

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

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

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

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

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


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

  20  alex30774 Сообщений: 782

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

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

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

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


Похрен.
avatar

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

  • 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

  20  alex30774 Сообщений: 782

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

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

  • 20 июня 2024, 11:27
+
0
This comment is no longer available.
Редактирован: 24 июня 2024, 12:47
avatar

  4  MT45PRO Сообщений: 22 - Аккаунт заблокирован

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

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

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

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

  • 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

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

  • 21 июня 2024, 20:10
0
This comment is no longer available.
Редактирован: 24 июня 2024, 12:46
avatar

  4  MT45PRO Сообщений: 22 - Аккаунт заблокирован

  • 21 июня 2024, 20:16
+
0
Можно как-то целый советник посмотреть потрогать или вы тут только обрывками кодов перекидываетесь))
avatar

  8  evgsergej Сообщений: 27

  • 23 июня 2024, 19:21
+
0
This comment is no longer available.
Редактирован: 24 июня 2024, 12:46
avatar

  4  MT45PRO Сообщений: 22 - Аккаунт заблокирован

  • 23 июня 2024, 20:56
0
Ничем помочь не могу. А у вас есть что предложить? А на счет балды посмотрите код. Или читать не умеете?
avatar

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

  • 23 июня 2024, 21:22
+
0
Можно как-то целый советник посмотреть потрогать..?

Посмотрите выше. Весь код в два захода. Одним файлом не вместился.
Редактирован: 23 июня 2024, 21:25
avatar

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

  • 23 июня 2024, 21:23
0
This comment is no longer available.
Редактирован: 24 июня 2024, 12:46
avatar

  4  MT45PRO Сообщений: 22 - Аккаунт заблокирован

  • 23 июня 2024, 21:31
0
Тот что в самом верху из двух частей- у меня почему-то слив идет и все… А то что после кода в переписке отрывки кодов я не совсем понимаю что на что заменить- чтоб попробовать(
avatar

  8  evgsergej Сообщений: 27

  • 24 июня 2024, 21:24
+
0
Может советник своп не учитывает?
avatar

  8  evgsergej Сообщений: 27

  • 24 июня 2024, 21:30
0
Бросьте его. Не тратьте время.
avatar

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

  • 24 июня 2024, 23:56

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