Завтра посмотрю на свежую голову, голова уже не варит
Можно вынести эти значения в настройки, оставив там минимальные
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
//------------------------------------------------------------------
//
//-----------------------условия марина------------------------
extern double LotSize = 1.0; // Величина торгуемого лота
extern bool MM = true; // использовать ли мартингейл
extern double LotExponent = 7; // на сколько умножать убыточный лот
extern int LotExponentStart = 1; // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3; // сколько раз умножать лот
//-------------------------------------------------------------------
extern int ma1per=5;
extern int ma2per=20;
extern int ma3per=50;
extern int ma4per=50;
extern string Name_Expert = "Rsi Trader";
extern bool UseAutoMagic = true;
extern int ManualMagic = 28282828;
extern double StopLoss = 100;
extern double TakeProfit = 100;
extern int Slippage = 5;
extern double Lots = 0.1;
extern double MaximumRisk = 0;
extern double DecreaseFactor = 3;
//
bool dummyResult;
string s_symbol;
int MAGIC;
int digit,STOPLEVEL;
double point = 1;
//
int init()
{
s_symbol = Symbol();
digit = MarketInfo(s_symbol,MODE_DIGITS);
if (digit==2 || digit==4) point = 1;
if (digit==3 || digit==5) point = 10;
if (digit==6) point = 100;
if (UseAutoMagic) MAGIC = ManualMagic;
else MAGIC = ManualMagic;
return(0);
}
//
//
int start()
{
double ma1 = iMA (NULL,0,ma1per,0,MODE_EMA,PRICE_CLOSE,1);
double ma2 = iMA (NULL,0,ma2per,0,MODE_EMA,PRICE_CLOSE,1);
double ma3 = iMA (NULL,0,ma3per,0,MODE_EMA,PRICE_CLOSE,1);
double ma4 = iMA (NULL,0,ma4per,0,MODE_EMA,PRICE_CLOSE,1);
//
if (!ExistPositions())
{
if(ma1<ma2 && ma2>ma3 && ma3>ma4 )
{
OpenBuy();
return(0);
}
if(ma1>ma2 && ma2<ma3 && ma3<ma4 )
{
OpenSell();
return(0);
}
}
return (0);
}
//
bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
return(true);
}
}
}
return(false);
}
//
void OpenBuy()
{
double lbStop = 0; if (StopLoss>0) lbStop = NormalizeDouble(Ask-StopLoss *Point*point,digit);
double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_BUY,LotsOptimized(StopLoss),NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,Name_Expert,MAGIC,0);
}
void OpenSell()
{
double lsStop = 0; if (StopLoss>0) lsStop = NormalizeDouble(Bid+StopLoss *Point*point,digit);
double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_SELL,LotsOptimized(StopLoss),NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,Name_Expert,MAGIC,0);
}
//
double LotsOptimized(double stopLoss)
{
double lot_min = MarketInfo(s_symbol,MODE_MINLOT);
double lot_max = MarketInfo(s_symbol,MODE_MAXLOT);
double lot_step = MarketInfo(s_symbol,MODE_LOTSTEP);
double contract = MarketInfo(s_symbol,MODE_LOTSIZE);
double lot = Lots;
int orders = HistoryTotal(); // history orders total
int losses = 0; // number of losses orders without a break
//
//
//
//
//
if(lot_min < 0.0 || lot_max <= 0.0 || lot_step <= 0.0)
{
Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
return(0);
}
if(AccountLeverage()<=0)
{
Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");
return(0);
}
//
//
//
//
//
if (MaximumRisk > 0 && stopLoss>0)
{
double pipMultiplier=1;
int tdigit = MarketInfo(s_symbol,MODE_DIGITS);
if (tdigit==2 || tdigit==4) pipMultiplier = 1;
if (tdigit==3 || tdigit==5) pipMultiplier = 10;
if (tdigit==6) pipMultiplier = 100;
double _point = MarketInfo(s_symbol,MODE_POINT);
lot = AccountFreeMargin()*(MaximumRisk/100.0)/(stopLoss*pipMultiplier*MarketInfo(s_symbol,MODE_TICKVALUE));
}
//+++++++++++++++++++++++++++++++++мартин надо исправить +++++++++++++++++++++++++++++++++++++++++++
if (MM)
{
lots = LotSize;
int ct = 0;
for (int c=1;c<=OrdersTotal();c++)
{
OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() != MAGIC) continue;
ct+=1; break;
}
if (ct == 0)
{
int clt = 0;
for (int co=1;co<=OrdersHistoryTotal();co++)
{
OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != MAGIC) continue;
if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
}
if (clt >= LotExponentStart && LotExponentMax != 0)
{
clt = 0;
int mult = 0;
for (int co2=1;co2<=OrdersHistoryTotal();co2++)
{
OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != MAGIC) continue;
if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
if (OrderProfit() >= 0) break;
}
if (mult <= LotExponentMax) lots = lot;
}
}
}
//+++++++++++++++++ конец мартина ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!= s_symbol || OrderType() > OP_SELL) continue;
//
//
//
//
//
if(OrderProfit() > 0) break;
if(OrderProfit() < 0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot - lot * losses/DecreaseFactor,2);
}
//
//
//
//
//
lot=NormalizeDouble(lot/lot_step,0)*lot_step;
if(lot<lot_min) lot=lot_min;
if(lot>lot_max) lot=lot_max;
return(lot);
}
//*******************************************
нормально код прикрепите пожалуйста в виде файла.Помогите исправит фунцию
Уважаемые специалисты!
Очень нужно, чтобы вы совместили два индикатора в одном. На вскидку, даёт очень неплохие результаты!
Спасибо!
Совершенно верно! Они чуть-чуть расходятся относительно друг друга. Хотелось-бы устранить эту проблему сделав один индикатор на основе этих двух.чем они вас по отдельности не устраивают? оО
что вы хотите получить соеденив их?
extern bool MM = true; // использовать ли мартингейл
extern double LotExponent = 7; // на сколько умножать убыточный лот
extern int LotExponentStart = 1; // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3; // сколько раз умножать лот
extern bool uplot = true; // вкл/выкл изменение величины лота
extern double lotmin = 0.1; // начальное значение
extern double lotmax = 0.7; // потолок
extern double lotstep = 0.1; // приращение лота
extern int lastprofit = 1; // принимает значения -1/1.
// -1 - увеличение лота после минусовой сделки до первой плюсовой.
// 1 - увеличение лота после плюсовой сделки до первой минусовой.
//--------------------------------------------------------
double GetLots() {
if (MM)
{
lots = LotSize;
int ct = 0;
for (int c=1;c<=OrdersTotal();c++)
{
OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() != Magic) continue;
ct+=1; break;
}
if (ct == 0)
{
int clt = 0;
for (int co=1;co<=OrdersHistoryTotal();co++)
{
OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != Magic) continue;
if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
}
if (clt >= LotExponentStart && LotExponentMax != 0)
{
clt = 0;
int mult = 0;
for (int co2=1;co2<=OrdersHistoryTotal();co2++)
{
OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != Magic) continue;
if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
if (OrderProfit() >= 0) break;
}
if (mult <= LotExponentMax) lots = lot;
}
}
}
else
{
lots = lots;
if (!uplot) return (lots);
int ticket = GetLastOrderHist();
if (ticket == -1) return (lots);
if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lots);
if (OrderProfit()*lastprofit < 0) return (lots);
lots = MathMin(OrderLots() + lotstep, lotmax);
}
return(lots);
}
int GetLastOrderHist(int type = -1) {
int ticket = -1;
datetime dt = 0;
int cnt = HistoryTotal();
for (int i=0; i < cnt; i++) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
//Опционально
if (OrderSymbol() != Symbol()) continue;
//Опционально
if (OrderMagicNumber() != Magic) continue;
if (type != -1 && OrderType() != type) continue;
if (OrderCloseTime() > dt) {
dt = OrderCloseTime();
ticket = OrderTicket();
}
}
return (ticket);
}
Здравствуйте! Обозначьте пожалуйста появление ступеньки алертом и звуком.
я могу сделать 100500 вариантов одного индикатора из этиз двух. вам какой по счету?Совершенно верно! Они чуть-чуть расходятся относительно друг друга. Хотелось-бы устранить эту проблему сделав один индикатор на основе этих двух.
Здравствуйте! Обозначьте пожалуйста появление ступеньки алертом и звуком.
Это шаблон совы к которому надо прикрепить функцию мартина: Посмотреть вложение 222592
Мне много не надо.я могу сделать 100500 вариантов одного индикатора из этиз двух. вам какой по счету?
Мне много не надо.
Просто совместите у этих индикаторов отметку 0, чтобы она не куда не уходила.
Установил LotExponentMax=3, 2 раза умножил, а 3-й раз лот остался такимже и 4-й тоже а должен если LotExponentMax=3 при лоте 0.1 следующая сделка 0.2 затем 0.4 и 0.8 и вне зависимости от результата после объёма в 0.8 лот должен стать опять 0.1добавил в ваш советник мартин по настройкам которые были в вашей функции.
в настройке martin_type выбирается тип мартингейла -
m_none - выключен
m_DecreaseFactor - тот который был в советнике
m_simple - тот который добавил я.
пробуйте.
Посмотреть вложение 222595
А как определить каждому индикатору значения мин. и макс? Тем более для каждой отдельной пары.Тогда все очень просто, отдельно в каждом индикаторе нужно выставить одинаковое значение закрепления для мак/мин. Тогда уровень "0" у индикаторов совпадет.
А как определить каждому индикатору значения мин. и макс? Тем более для каждой отдельной пары.