Лента последних комментариев


0
Это не оптимизированный вариант, но рабочий. При желании займемся оптимизацией и правильными функциями. Вобщем топик для того и делался. Правда желающих поучаствовать четыре человека.Ты да Я, да Мы с Тобой.

Открываешь в редакторе любой советник. Жмешь «Сохранить как» «Мой кассовый аппарат».
Удаляешь весь код этого советника.
Потом на пустое место последовательно копируешь три части кода.

Жмешь «Компилировать».

В терминале окажется нужный советник под названием «Мой кассовый аппарат».
Оптимизировать можно по контрольным точкам. Перепроверять по тикам.

Удачи.
avatar

kvashnin007

  • 28 января 2025, 23:58
0
Смотрел на картинку…



смотрел…

Можно получить похожую. Просадка, правда, будет чуть побольше. Сделок в минус будет 30%.

Это вариант «лесенки» с малым шагом и тралом минимальной прибыли. Должен получиться частотник сеточного типа с локированием. Две независимые ветви (возможно полностью). Получится двойное локирование.
Без индикаторов. С минимальным количеством переменных для оптимизации.
avatar

kvashnin007

  • 28 января 2025, 23:49
0
А как собрать все три части в рабочий код, чтобы в живую посмотреть работу в тестере?
avatar

Aleh7999

  • 28 января 2025, 21:01
0
Почитал обсуждения советника.
Сделал вывод, что советник Робот GBPUSD — туфта.

Я бы на него не тратил время.
avatar

kvashnin007

  • 28 января 2025, 14:52
0
Андрей, я длохо понимаю идею изучать советники по визуализации и сделкам Если ты вот так «легко» определяешь стратегию, то этот советник уже максимум через полгода станет не актуальным.

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

SL и ТР можно и нужно выкинуть. Так. Еще пара изменений. Ерундовых. Ну и правильные функции + проверки с работой над ошибками. Большую часть изменений я могу за пару дней поправить.
avatar

kvashnin007

  • 28 января 2025, 14:20
0
Реквизиты
avatar

Denis2134

  • 28 января 2025, 13:56
0
Да. Советник, судя по картинке, шикарный.
Смущает, что это таки тестер.

Логика, как раз, не читается, ибо советника не имею и не гонял.
Но даже по картинке уже возникают вопросы. Порассуждаем логически.

Советник делает всреднем 100 сделок в день. За четыре года — 9850 сделок. При тех просадках по марже, что на картинке можно предположить, что делает он это минимальными лотами и сделки закрываются довольно быстро. Просадка по марже 6.8%.
прибыльная позиция после закрытия отщипывает от убыточной

Тут я не согласен от слова совсем.
Во-первых со смыслом предложения. Что означает — закрытая позиция отщипывет?
Во-вторых, если имеется ввиду, что кусочки убытков сокращаются кусочками прибыльных ордеров, то мы бы имели убыточных сделок на порядок больше 1.36%.Скорее еще больше.
Судя по практическому равенству ордеров на продажу и покупку, стратегия локовая. Я уже говорил за Lock4.

Дальше. Линия депозата прямая. Логично предположить, что ММ не предусматривает роста лотов от роста депозита, ибо линия была бы экспоненциальной.
Дико смущают абсолютная и относительная просадки. Цифры как-то не коррелируются. Относительная 1.47% к абсолютной 0.89% как бы нормально соотносится, но при этом 7622 к 105 — явно диссонанс. Логично наоборот. В купе с тем, что картинка из тестера, навязчиво возникают мысли о фотошопе.

А то, что авторы в описании ссылаются на возврат части спреда, то это абсолютно справедливо, хотя это к пониманию алгоритма не приближает.

ВЫВОД: КОТ В МЕШКЕ. Хотя, возможно, и породистый.
avatar

kvashnin007

  • 28 января 2025, 13:48
0
евро и фунт


вот фунт:



//--- Inputs
input
int BB_Period             = 20;  // Bollinger Bands Period
input
double BB_Deviation       = 1.0; // Deviation
input
int ATR_Period            = 14;  // ATR Period
input
int ATR_Lookback          = 50;  // Period for ATR Minimum
input
double BB_Width_Threshold = 500; // Max BB Width for Squeeze
input
double LotSize            = 0.01;// Initial Lot Size
input
double Multiplier         = 2.0; // Martingale Multiplier
input
int StopLoss_ATR          = 20;  // StopLoss (ATR multiples)
input
int TakeProfit_ATR        = 30;  // TakeProfit (ATR multiples)
input
int TrailingStep          = 222; // Trailing Stop Step (points)


настройки оптимизацией подбирай
avatar

AM2

  • 28 января 2025, 10:56
0
очень интересный советник. логика хорошо читается. прибыльная позиция после закрытия отщипывает от убыточной
avatar

AM2

  • 28 января 2025, 09:42
0
вот тоже интересный советник. пока еще не знаю как работает: www.mql5.com/ru/market/product/123850
avatar

AM2

  • 28 января 2025, 09:13
0


Без тщательног подбора, на тиках за три месяца. С 1000 получили 2400.
Но его надо немного подработать. Оптимизировать. Сигнальный блок «яжелый». Можно заменить.

Сам же советник хорош следующими вещами:

— огромный диапазон размера внешних переменных;
— малое количество подбираемых при оптимизации переменных;
— оптимизировать можно и по ценам закрытия.
avatar

kvashnin007

  • 28 января 2025, 07:07
0
а вообще каков алгоритм подбора параметров, -ну там наверное нужно использовать перекрестие.
avatar

igrun

  • 28 января 2025, 03:32
0
Часть 3

//*************************************************************//
   
for(int i=OrdersTotal()-1;i>=0;i--)
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         
if(OrderMagicNumber()==iMagicNumber)
           
if(OrderSymbol()==Symbol())
             
{
               op
=NormalizeDouble(OrderOpenPrice(),Digits());
               tp
=NormalizeDouble(OrderTakeProfit(),Digits());
               lt
=NormalizeDouble(OrderLots(),2);
               tk
=OrderTicket();
               
               
//---
               
if(OrderType()==OP_BUY && b==1 && tp==0)
                 
if(!OrderModify(tk,op,NormalizeDouble(Ask-StopLoss*Point(),Digits()),NormalizeDouble(Ask+iTakeProfit*Point(),Digits()),0,clrRed))
                     
Print("OrderModify error #",GetLastError());

               
if(OrderType()==OP_SELL && s==1 && tp==0)
                 
if(!OrderModify(tk,op,NormalizeDouble(Bid+StopLoss*Point(),Digits()),NormalizeDouble(Bid-iTakeProfit*Point(),Digits()),0,clrRed))
                     
Print("OrderModify error #",GetLastError());
               
//---
               
if(OrderType()==OP_BUY && b>=2)
                 
{
                 
if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                     
if(Bid<AwerageBuyPrice && tp!=AwerageBuyPrice)
                       
if(!OrderModify(tk,op,OrderStopLoss(),AwerageBuyPrice,0,clrRed))
                           
Print("OrderModify error #",GetLastError());

                 
if(tk!=BuyPriceMaxTic && tk!=BuyPriceMinTic && tp!=0)
                     
if(!OrderModify(tk,op,0,0,0,clrRed))
                       
Print("OrderModify error #",GetLastError());
                 
}
               
if(OrderType()==OP_SELL && s>=2)
                 
{
                 
if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                     
if(Ask>AwerageSelPrice && tp!=AwerageSelPrice)
                       
if(!OrderModify(tk,op,OrderStopLoss(),AwerageSelPrice,0,clrRed))
                           
Print("OrderModify error #",GetLastError());

                 
if(tk!=SelPriceMaxTic && tk!=SelPriceMinTic && tp!=0)
                     
if(!OrderModify(tk,op,0,0,0,clrRed))
                       
Print("OrderModify error #",GetLastError());
                 
}
             
}
 
}
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
void OnDeinit(const int reason)
 
{

 
}
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
bool CheckVolumeValue(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);
 
}
//************************************************************************************************/
int Signal()
{
       
double slope1 = slope(1,period);
       e1
=w1*slope1+w2*e1;
       e2
=w1*e1+w2*e2;
       e3
=w1*e2+w2*e3;
       e4
=w1*e3+w2*e4;
       e5
=w1*e4+w2*e5;
       e6
=w1*e5+w2*e6;
       t3
=c1*e6+c2*e5+c3*e4+c4*e3;
        slope1
= t3*5000;  
           
       
double slope2 = slope(2,period);
       e1
=w1*slope2+w2*e1;
       e2
=w1*e1+w2*e2;
       e3
=w1*e2+w2*e3;
       e4
=w1*e3+w2*e4;
       e5
=w1*e4+w2*e5;
       e6
=w1*e5+w2*e6;
       t3
=c1*e6+c2*e5+c3*e4+c4*e3;
        slope2
= t3*5000;      
           
       
double slope3 = slope(3,period);
       e1
=w1*slope3+w2*e1;
       e2
=w1*e1+w2*e2;
       e3
=w1*e2+w2*e3;
       e4
=w1*e3+w2*e4;
       e5
=w1*e4+w2*e5;
       e6
=w1*e5+w2*e6;
       t3
=c1*e6+c2*e5+c3*e4+c4*e3;
       
       slope3
= t3*5000;
       
 
//      BB();    
       
       
if(t==reversP)
         
{
         
if(slope2<slope3 && slope3<slope1 && slope2<0)
           
return OP_BUY;
         
if(slope2>slope3 && slope3>slope1 && slope2>0)
           
return OP_SELL;
         
}
       
if(t==revers)
         
{
         
if(slope2<slope3 && slope3<slope1)
           
return OP_BUY;
         
if(slope2>slope3 && slope3>slope1)
           
return OP_SELL;
         
}
       
if(t==speed)
         
{
         
if(slope3-slope2 > slope2-slope1)
           
return OP_BUY;
         
if(slope3-slope2 < slope2-slope1)
           
return OP_SELL;
         
}
       
if(t==vsa)
         
{
         
if( (slope3*MathAbs(Close[3]-Open[3])-slope2*MathAbs(Close[2]-Open[2])) >
             
(slope2*MathAbs(Close[2]-Open[2])-slope1*MathAbs(Close[1]-Open[1])))
           
return OP_BUY;
         
if( (slope3*MathAbs(Close[3]-Open[3])-slope2*MathAbs(Close[2]-Open[2])) <
             
(slope2*MathAbs(Close[2]-Open[1])-slope1*MathAbs(Close[1]-Open[1])))
           
return OP_SELL;
         
}
       
if(t==volume)
         
{
         
if((slope3-slope2)/Volume[2] > (slope2-slope1)/Volume[1])
           
return OP_BUY;
         
if((slope3-slope2)/Volume[2] > (slope2-slope1)/Volume[1])
           
return OP_SELL;
         
}
 
return -1;
}
//************************************************************************************************/
double slope(int iBar, int nBars)
{
     
double sumy=0,
             sumx
=0,
             sumx2
=0,
             sumxy
=0,
             sumy2
=0;
     
int iLimit = iBar + nBars-1,index=1,counter=nBars;
     
while(counter>0)
     
{      //Print(index);
         
double price=Close[iBar];
                     
         sumy
+=price;
         sumxy
+=(NormalizeDouble(price*counter,12));
         
//Print((NormalizeDouble(Open[iBar]*counter,12)),",",Open[iBar],",",counter);
         sumx
+=counter;
         sumx2
+=MathPow(counter,2);
         sumy2
+=MathPow(sumy,2);
         iBar
++;  
         counter
--;                
     
}      
     
double top=NormalizeDouble(sumxy,12)-(nBars*(sumx/nBars)*(sumy/nBars));
     
double bottom=sumx2-nBars*(sumx/nBars);
     
     
double rTop=nBars*sumxy-(sumx*sumy);
     
double rBottom=MathSqrt((nBars*sumx2-MathPow(sumx,2))*(nBars*sumy2-MathPow(sumy,2)));
     
double r2=(MathPow(rTop/rBottom,2));
     
//Print(rTop/rBottom);
   
return NormalizeDouble(top/bottom,12);
}
//----------------------------------------------------------------------
avatar

kvashnin007

  • 27 января 2025, 19:42
0
Часть 2

//*************************************************************//
   
double   AwerageBuyPrice=0,AwerageSelPrice=0;
   
 
if(iCloseOrder==Awerage)      // All close All
   
{  
   
if(b>=2)
     
AwerageBuyPrice=NormalizeDouble((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*BuyPriceMinLot)
                                   
/(BuyPriceMaxLot+BuyPriceMinLot)+iMinimalProfit*Point(),Digits());
   
if(s>=2)
     
AwerageSelPrice=NormalizeDouble((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)
                                   
/(SelPriceMaxLot+SelPriceMinLot)-iMinimalProfit*Point(),Digits());
   
}
   
//---                                
 
if(iCloseOrder==StartClose)  // Start close Start
   
{    
   
if(b>=2)
     
AwerageBuyPrice=NormalizeDouble((BuyPriceMax*iStartLots+BuyPriceMin*iStartLots)
                                   
/(iStartLots+iStartLots)+iMinimalProfit*Point(),Digits());
   
if(s>=2)
     
AwerageSelPrice=NormalizeDouble((SelPriceMax*SelPriceMaxLot+SelPriceMin*SelPriceMinLot)
                                   
/(SelPriceMaxLot+SelPriceMinLot)-iMinimalProfit*Point(),Digits());
   
}  
   
//---                              
 
if(iCloseOrder==Comby)      // Start close All
   
{  
   
if(b>=2)
     
AwerageBuyPrice=NormalizeDouble((BuyPriceMax*BuyPriceMaxLot+BuyPriceMin*iStartLots)
                                   
/(BuyPriceMaxLot+iStartLots)+iMinimalProfit*Point(),Digits());
   
if(s>=2)
     
AwerageSelPrice=NormalizeDouble((SelPriceMax*iStartLots+SelPriceMin*SelPriceMinLot)
                                   
/(iStartLots+SelPriceMinLot)-iMinimalProfit*Point(),Digits());
   
}                                
//*************************************************************//
   
double BuyLot = 0, SelLot = 0;
 
if(!MM)
   
{
   
if(b==0)
     
BuyLot = iStartLots;
   
else
     
BuyLot = NormalizeDouble(MathCeil((BuyPriceMinLot * CoeffLots)*100)/100,2);
   
//---  
   
if(s==0)
     
SelLot = iStartLots;
   
else
     
SelLot = NormalizeDouble(MathCeil((SelPriceMaxLot * CoeffLots)*100)/100,2);
   
}
 
//----------------------------------------------------------
 
if(MM)
   
{
   
if(BuyPriceMinLot == 0 || b==0)
     
BuyLot = AccountFreeMargin()*Risk/100;
   
else
     
BuyLot = NormalizeDouble(MathCeil((BuyPriceMinLot * CoeffLots)*100)/100,2);
     
   
if(SelPriceMaxLot == 0 || s==0)
     
SelLot = AccountFreeMargin()*Risk/100;
   
else
     
SelLot = NormalizeDouble(MathCeil((SelPriceMaxLot * CoeffLots)*100)/100,2);
   
}
//*************************************************************//

   
if(BuyLot>iMaximalLots)      
     
BuyLot=iMaximalLots;
   
if(SelLot>iMaximalLots)      
     
SelLot=iMaximalLots;
     
   
if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot))
     
return;  
//*************************************************************//
   
int Dir=Signal();
   
if(Dir==OP_BUY)// && Close[1]>High[2])
     
if((b==0) || (b>0 && (BuyPriceMin-Ask)>(iPointOrderStep*Point())))
         
if(OrderSend(Symbol(),OP_BUY,NormalizeDouble(BuyLot,2),NormalizeDouble(Ask,Digits()),iSlippage,0,0,"",iMagicNumber,0,clrGreen)<0)
           
Print("OrderSend error #",GetLastError());

   
if(Dir==OP_SELL)// && Close[1]<Low[2])
     
if((s==0) || (s>0 && (Bid-SelPriceMax)>(iPointOrderStep*Point())))
         
if(OrderSend(Symbol(),OP_SELL,NormalizeDouble(SelLot,2),NormalizeDouble(Bid,Digits()),iSlippage,0,0,"",iMagicNumber,0,clrGreen)<0)
           
Print("OrderSend error #",GetLastError());
//*************************************************************//
avatar

kvashnin007

  • 27 января 2025, 19:41
0
Часть 1

#property strict
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
enum type
 
{
   reversP  
=1,     // Revers Part
   revers  
=2,     // Revers
   speed    
=3,     // Speed
   vsa      
=4,     // VSA
   volume  
=5      // Volume
 
};
enum ENUM_ST
 
{
   
Awerage      = 0,  // All close All
   
StartClose   = 1,  // Start close Start
   
Comby        = 2   // Start close All
 
};
//************************************************************************************************/
input ENUM_ST      iCloseOrder        
= Awerage;  // Type close orders
input
int          StopLoss            = 20;       // Stop Loss (in pips)
input
int          iTakeProfit         = 300;      // Take Profit (in pips)
input
bool         MM                  = false;    // Мани Менеджмент
input
double       Risk                = 0.5;      // Риск на сделку % в процентах от свободной маржи.
input
double       iStartLots          = 0.01;     // Start lot
input
double       CoeffLots           = 2.0;      // Увеличение лота
input
double       iMaximalLots        = 2.56;     // Maximal Lots
input
int          iPointOrderStep     = 390;      // Point order step (in pips)
input
int          iMinimalProfit      = 70;       // Minimal profit for close grid (in pips)
input
int          iMagicNumber        = 227;      // Magic Number (in number)
input
int          iSlippage           = 30;       // Slippage (in pips)
//---
input
int          period              = 6;        //Period
input
int          t3_period           = 1;
input
double       B                   = 0.03;
input type         t                  
= revers;   //Type Signals
double slopeBuffer[];

double e1,e2,e3,e4,e5,e6,
       c1
,c2,c3,c4,
       n
,
       w1
,w2,
       b2
,b3,
       t3
;
double ExtUp[], ExtDn[], ExtMd[], ExtBuyArrow[], ExtSellArrow[],
       
BBUp[], BBDn[], BBMd[],
       priceUp
[], priceDn[], signalUp[], signalDn[];
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
int OnInit()
 
{
   
Comment("");
//---
   b2
=B*B;
   b3
=b2*B;
   c1
=-b3;
   c2
=(3*(b2+b3));
   c3
=-3*(2*b2+B+b3);
   c4
=(1+3*B+b3+3*b2);
   n
=t3_period;
   
   
if(n<1) n=1;
   n
=1+0.5*(n-1);
   w1
=2/(n+1);
   w2
=1-w1;
//----
   
return(INIT_SUCCEEDED);
 
}
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
void OnTick()
 
{
   
double
   
BuyPriceMax=0,BuyPriceMin=0,BuyPriceMaxLot=0,BuyPriceMinLot=0,
   
SelPriceMin=0,SelPriceMax=0,SelPriceMinLot=0,SelPriceMaxLot=0;

   
int
   
BuyPriceMaxTic=0,BuyPriceMinTic=0,SelPriceMaxTic=0,SelPriceMinTic=0;

   
double
   op
=0,lt=0,tp=0;

   
int
   tk
=0,b=0,s=0;

   
for(int i=OrdersTotal()-1;i>=0;i--)
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         
if(OrderMagicNumber()==iMagicNumber)
           
if(OrderSymbol()==Symbol())
             
{
               op
=NormalizeDouble(OrderOpenPrice(),Digits());
               lt
=NormalizeDouble(OrderLots(),2);
               tk
=OrderTicket();
               
if(OrderType()==OP_BUY)
                 
{
                  b
++;
                 
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
++;
                 
if(op>SelPriceMax || SelPriceMax==0)
                   
{
                     
SelPriceMax    = op;
                     
SelPriceMaxLot = lt;
                     
SelPriceMaxTic = tk;
                   
}
                 
if(op<SelPriceMin || SelPriceMin==0)
                   
{
                     
SelPriceMin    = op;
                     
SelPriceMinLot = lt;
                     
SelPriceMinTic = tk;
                   
}
                 
}
             
}
//*************************************************************//
avatar

kvashnin007

  • 27 января 2025, 19:39
0
Кривая симпатичная. Доходность приличная.
Но по этой страничке много не поймешь. Просадка какая, например?
но результаты достойные. Прямую на граике рисовать бесполезно. Кривая экспоненциальная. И сградилась либо за счет небольшого шага, либо, скорее, за счет мультивалютности. Такое в тестер МТ4 не запихнешь.

Мой же советник будет рисовать ступенчатый рост.
avatar

kvashnin007

  • 27 января 2025, 19:37
0
Ок. Попробую его.
avatar

vladimir31

  • 27 января 2025, 17:28
0
альпари
avatar

verta81

  • 27 января 2025, 17:27
Загрузка...