Хитрый усреднитель на MQL5 |
input int BuySell = 1; // 1-Only Buy 2-Only Sell
input int Step = 1000; // Step
input double Lot = 0.1; // Volume
input double BigLot = 1; // Big Lot
input double MaxLots = 5; // Maximum lot
input double Profit = 60; // Dollars Profit
input double Loss = 5100; // Dollars Loss
input double Mnogitel = 12; // Lots Mnogitel
#include <Trade\Trade.mqh>
CTrade trade;
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
double SymbProfit(string Symb)
{
double p=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
if(PositionGetSymbol(i)==Symb)
{
p=+PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
}
}
return(p);
}
//+------------------------------------------------------------------+
//| Position Volume |
//+------------------------------------------------------------------+
double Lots(string Symb)
{
double lots=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
if(PositionGetSymbol(i)==Symb)
{
if(PositionGetInteger(POSITION_TYPE)<2)
{
lots=PositionGetDouble(POSITION_VOLUME);
}
}
}
return(lots);
}
string symb=Symbol();
double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
double Bid=SymbolInfoDouble(symb,SYMBOL_BID);
if(bars!=Bars(symb,0))
{
...
bars=Bars(symb,0);
}
if(BuySell==1 && (PositionsTotal()<1 || (PositionsTotal()>0 && (pr-Ask)/_Point>=Step))) {trade.PositionOpen(symb,0,lot,Ask,0,0); pr=Bid;}//buy
if(BuySell==2 && (PositionsTotal()<1 || (PositionsTotal()>0 && (Bid-pr)/_Point>=Step))) {trade.PositionOpen(symb,1,lot,Bid,0,0); pr=Bid;}//sell
if(Lots(symb)>=BigLot) lot=lot*Mnogitel;
if(lot>MaxLots) lot=Lot;
if(SymbProfit(symb)>Profit || SymbProfit(symb)<-Loss) {trade.PositionClose(symb); lot=Lot;}
if(BuySell==1 && (PositionsTotal()<1 || (PositionsTotal()>0 && (pr-Ask)/_Point>=Step))) {... pr=Bid;}//buy
if(BuySell==2 && (PositionsTotal()<1 || (PositionsTotal()>0 && (Bid-pr)/_Point>=Step))) {... pr=Bid;}//sell
Comment("\n Lots: ",Lots(symb),
"\n Profit: ",SymbProfit(symb),
"\n Price: ",pr);
if(SymbProfit(symb)>Profit || SymbProfit(symb)<-Loss) {... lot=Lot;}
//+------------------------------------------------------------------+
//| HelloSmart.mq5 |
//| Copyright 2016, AM2 |
//| https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.00"
#include <Trade\Trade.mqh>
CTrade trade;
input int BuySell = 1; // 1-Only Buy 2-Only Sell
input int Step = 1000; // Step
input double Lot = 0.1; // Volume
input double BigLot = 1; // Big Lot
input double MaxLots = 5; // Maximum lot
input double Profit = 60; // Dollars Profit
input double Loss = 5100; // Dollars Loss
input double Mnogitel = 12; // Lots Mnogitel
int bars=0;
double lot=Lot,pr=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Position Profit |
//+------------------------------------------------------------------+
double SymbProfit(string Symb)
{
double p=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
if(PositionGetSymbol(i)==Symb)
{
p=+PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
}
}
return(p);
}
//+------------------------------------------------------------------+
//| Position Volume |
//+------------------------------------------------------------------+
double Lots(string Symb)
{
double lots=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
if(PositionGetSymbol(i)==Symb)
{
if(PositionGetInteger(POSITION_TYPE)<2)
{
lots=PositionGetDouble(POSITION_VOLUME);
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
string symb=Symbol();
double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
double Bid=SymbolInfoDouble(symb,SYMBOL_BID);
if(bars!=Bars(symb,0))
{
if(BuySell==1 && (PositionsTotal()<1 || (PositionsTotal()>0 && (pr-Ask)/_Point>=Step))) {trade.PositionOpen(symb,0,lot,Ask,0,0); pr=Bid;}//buy
if(BuySell==2 && (PositionsTotal()<1 || (PositionsTotal()>0 && (Bid-pr)/_Point>=Step))) {trade.PositionOpen(symb,1,lot,Bid,0,0); pr=Bid;}//sell
if(Lots(symb)>=BigLot) lot=lot*Mnogitel;
if(lot>MaxLots) lot=Lot;
if(SymbProfit(symb)>Profit || SymbProfit(symb)<-Loss) {trade.PositionClose(symb); lot=Lot;}
bars=Bars(symb,0);
}
Comment("\n Lots: ",Lots(symb),
"\n Profit: ",SymbProfit(symb),
"\n Price: ",pr);
}
//+------------------------------------------------------------------+
08 сентября 2016
|
15 сентября 2016
|
Комментарии (8)
34 AM2 Автор Сообщений: 15882 - Андрей
12 sorusm Сообщений: 181 - sorusm
12 sorusm Сообщений: 181 - sorusm
Никак не могу понять, почему «больше или равно», если по логике должно быть «меньше или равно». Lots(symb)-это количество открытых позиций по конкретному символу?
Если меняю знак >= на <=, компилирую, на графике советник торгует, вроде бы нормально, а вот в тестере не появляется ни одной сделки. В чём может быть причина?
7 s22aa Сообщений: 25 - Александр
if(lot>MaxLots) lot=Lot;
меняем на
if(lot>MaxLots) lot=MaxLots;
Редактирован: 18 апреля 2022, 13:25
7 kvashnin007 Сообщений: 525 - Андрей
Хотя можно попробовать и предлагаемый мной вариант.
Правда, хитрости в усреднении большой не обнаружено.
Можно гораздо хитрее. Редактирован: 18 апреля 2022, 13:33
7 kvashnin007 Сообщений: 525 - Андрей
если параметр BuySell = 1, то вообще сделок не открывает ни на бай ни на селл.
Но не у всех в Альпари и на Робофорексе работает. Редактирован: 19 мая 2022, 13:43
19 alex30774 Сообщений: 715
4 Ali-k Сообщений: 15
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий