Как кодировать? - страница 100

 

только покупка, никаких продаж

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

Кто-нибудь знает почему?

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+

 

опубликуйте общий код, есть еще одна вещь, которая не подходит...

второй шаг - это, возможно, ваши функции iCustom().

panteraschoice:
создавая прибыльную ea, но она могла бы быть в два раза лучше (возможно), так как сейчас выставляются только бай, но никогда селл ордера.

Кто-нибудь знает почему?

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+
 

Помещение и просмотр объектов на будущие даты?

Здравствуйте, кто-нибудь знает, поддерживает ли MQL4 размещение объекта индикатора в будущее и просмотр будущего объекта? Я пробовал ObjectMove на будущую дату (ошибка не возвращается), но отображение останавливается на дате последнего тика. Спасибо

 

У МА есть функция сдвига... если вы это имеете в виду. +2 сдвинет ее вперед на 2 TF бара. -2 сдвинет назад на 2.

 
IN10TION:
опубликуйте общий код, есть еще одна вещь, которая неверна... второй шаг - это, возможно, ваши функции iCustom().

#ссылка на свойство "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта |

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("Время для торговли еще не наступило!");

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+

//Покупка

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

Проскальзывание,

NormalizeDouble(StopLossLevel,цифра),

NormalizeDouble(TakeProfitLevel,цифра),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Открыт ордер BUY : ", OrderOpenPrice()); else Print("Ошибка открытия ордера BUY : ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Продажа

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit),

Проскальзывание,

NormalizeDouble(StopLossLevel,цифра),

NormalizeDouble(TakeProfitLevel,цифра),

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print(" Открытордер SELL: ", OrderOpenPrice()); else Print("Ошибка открытия ордера SELL : ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Проверка позиции

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Закрыть

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return (0);

}

//Трейлинг-стоп

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//Закрытие

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return (0);

}

//Трейлинг-стоп

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { }

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// return(True);

// }

// }

// }

// return(false);

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // общее количество ордеров в истории

int losses=0; // количество ордеров с потерями без перерыва

//---- выбор размера лота

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- вычисляем количество убыточных ордеров без перерыва

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Ошибка в истории!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- возвращает размер лота

if(lot<0.1) lot=0.1;

return(lot);

}

//+------------------------------------------------------------------+

 

Получаете ли вы какой-либо код ошибки или что-то еще (при бэктестинге), что дает вам подсказку, что идет не так?

panteraschoice:
#property link "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта |

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("Время для торговли еще не пришло!");

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+

//Покупка

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

Проскальзывание,

NormalizeDouble(StopLossLevel,цифра),

NormalizeDouble(TakeProfitLevel,цифра),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Открыт ордер BUY : ", OrderOpenPrice()); else Print("Ошибка открытия ордера BUY : ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Продажа

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit),

Проскальзывание,

NormalizeDouble(StopLossLevel,цифра),

NormalizeDouble(TakeProfitLevel,цифра),

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Открыт ордер SELL : ", OrderOpenPrice()); else Print("Ошибка открытия ордера SELL : ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Проверка позиции

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Закрыть

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return (0);

}

//Трейлинг-стоп

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//Закрытие

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return (0);

}

//Трейлинг-стоп

if (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

// if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { }

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// return(True);

// }

// }

// }

// return(false);

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // общее количество ордеров в истории

int losses=0; // количество ордеров с потерями без перерыва

//---- выбор размера лота

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- вычисляем количество убыточных ордеров без перерыва

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Ошибка в истории!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- возвращает размер лота

if(lot<0.1) lot=0.1;

return(lot);

}

//+------------------------------------------------------------------+
 

Сейчас я делаю бэктест только с RSIFilter, я использую RSIMixFilter несколько сообщений назад в этой теме, я опубликовал этот индикатор, и я действительно получаю покупки и продажи, так что логика создания ордеров BUY и SELL в порядке, проблема в ваших сигналах iCustom...

RSIMixFilter, не в этой теме, извините, он здесь ASK.

panteraschoice:
создавая прибыльную ea, но она могла бы быть в два раза лучше (возможно), так как сейчас выставляются только бай, но никогда селл ордера.

Кто-нибудь знает почему?

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Линия направления наклона",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+
 

Я сделал несколько бэктестов, EURUSD H1 с апреля 2007 года по настоящее время, только с этим RSIMixFilter...

Качество моделирования должно быть 90%, не знаю, почему оно не отображается.

panteraschoice:
создавая прибыльную ea, но она могла бы быть в два раза лучше (возможно), так как сейчас выставляются только бай, но никогда селл ордера.

Кто-нибудь знает почему?

//+------------------------------------------------------------------+

//| Signal Begin |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Линия направления наклона",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

if (sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+
Файлы:
 

Это бэктестирование давало покупки и продажи или только одно из них? У меня были только покупки (или только продажи, когда я изменил код).

Я действительно не видел ничего, что показывало бы ошибку.

 
IN10TION:
Сейчас я делаю бэктест только с RSIFilter, я использую RSIMixFilter несколько сообщений назад в этой теме, я опубликовал этот индикатор, и я действительно получаю покупки и продажи, так что логика создания ордеров BUY и SELL в порядке, проблема в ваших сигналах iCustom...

Так это нормально?

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

если (Sg>0) Ордер = СИГНАЛ_ПОКУПАТЬ;

if (Sg<0) Order = SIGNAL_SELL;