Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
только покупка, никаких продаж
создаю прибыльную еа, но она могла бы быть в два раза лучше (возможно), так как сейчас ставятся только бай, но никогда селл.
Кто-нибудь знает почему?
//+------------------------------------------------------------------+
//| 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().
создавая прибыльную 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.
опубликуйте общий код, есть еще одна вещь, которая неверна... второй шаг - это, возможно, ваши функции 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);
}
//+------------------------------------------------------------------+
Получаете ли вы какой-либо код ошибки или что-то еще (при бэктестинге), что дает вам подсказку, что идет не так?
#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.
создавая прибыльную 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%, не знаю, почему оно не отображается.
создавая прибыльную 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;
//+------------------------------------------------------------------+
//| Конец сигнала |
//+------------------------------------------------------------------+Это бэктестирование давало покупки и продажи или только одно из них? У меня были только покупки (или только продажи, когда я изменил код).
Я действительно не видел ничего, что показывало бы ошибку.
Сейчас я делаю бэктест только с RSIFilter, я использую RSIMixFilter несколько сообщений назад в этой теме, я опубликовал этот индикатор, и я действительно получаю покупки и продажи, так что логика создания ордеров BUY и SELL в порядке, проблема в ваших сигналах iCustom...
Так это нормально?
double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);
если (Sg>0) Ордер = СИГНАЛ_ПОКУПАТЬ;
if (Sg<0) Order = SIGNAL_SELL;