Определение типа свечи и проверка соответствия диапазону свечи.
bool BarsSignal_buy(int SSP=1)
{
double AvgRange;
int val=false;
AvgRange=MathAbs(iClose(SSP)-iOpen(SSP));
if(AvgRange>=bar_1 && AvgRange<=bar)//
{
if(Candle_type_sell(1))
val=true;
else
val=false;
}
return(val);
}
//+------------------------------------------------------------------+
// получение разницы открытия и закрытия..
bool BarsSignal_sell(int SSP=1)
{
double AvgRange_1;
int val_1=false;
AvgRange_1=MathAbs(iClose(SSP)-iOpen(SSP));
if(AvgRange_1>=bar_1 && AvgRange_1<=bar)// bar= 0.001
{
if(Candle_type_buy(1))
val_1=true;
else
val_1=false;
}
return(val_1);
}
Здесь попытка написать пункт 2 описанный в начале темы.
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
{
total_buy=PositionTotal(POSITION_TYPE_BUY);
total_sell=PositionTotal(POSITION_TYPE_SELL);
}
//--- get transaction type as enumeration value
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
if(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_entry =0;
double deal_profit =0.0;
double deal_volume =0.0;
long deal_type =0;
string deal_symbol ="";
string deal_comment ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
deal_comment=HistoryDealGetString(trans.deal,DEAL_COMMENT);
deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
}
else
return;
if(deal_symbol==Symbol() && deal_magic==Magic)
if(deal_entry==DEAL_ENTRY_OUT)
{
if(deal_profit>0)
{
//--- есть шанс, что это было закрытие по TakeProfit
if(StringFind(deal_comment,"tp",0)==-1)
return;
//--- если закрыли BUY
if(deal_type==DEAL_TYPE_SELL)
{
if(deal_volume>lot_sell)
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
//--- обнуление для BUY
bln_buy=false;
}
//--- если закрыли SELL
if(deal_type==DEAL_TYPE_BUY)
{
if(deal_volume>lot_buy)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
//--- обнуление для SELL
bln_sell=false;
}
}
}
}
}
Часть кода взята из данного советника - https://www.mql5.com/ru/code/17438
- голосов: 13
- 2017.01.20
- Vladimir Karputov
- www.mql5.com
Определение типа свечи и проверка соответствия диапазону свечи.
bool BarsSignal_buy(int SSP=1)
{
double AvgRange;
int val=false;
AvgRange=MathAbs(iClose(SSP)-iOpen(SSP));
if(AvgRange>=bar_1 && AvgRange<=bar)//
{
if(Candle_type_sell(1))
val=true;
else
val=false;
}
return(val);
}
//+------------------------------------------------------------------+
// получение разницы открытия и закрытия..
bool BarsSignal_sell(int SSP=1)
{
double AvgRange_1;
int val_1=false;
AvgRange_1=MathAbs(iClose(SSP)-iOpen(SSP));
if(AvgRange_1>=bar_1 && AvgRange_1<=bar)// bar= 0.001
{
if(Candle_type_buy(1))
val_1=true;
else
val_1=false;
}
return(val_1);
}
"bar_1" и "bar" - это input параметры первого и второго бара?
Вот так:
писать нельзя. Нужно так:
Здесь попытка написать пункт 2 описанный в начале темы.
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
{
total_buy=PositionTotal(POSITION_TYPE_BUY);
total_sell=PositionTotal(POSITION_TYPE_SELL);
}
//--- get transaction type as enumeration value
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
if(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_entry =0;
double deal_profit =0.0;
double deal_volume =0.0;
long deal_type =0;
string deal_symbol ="";
string deal_comment ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
deal_volume=HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
deal_comment=HistoryDealGetString(trans.deal,DEAL_COMMENT);
deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
}
else
return;
if(deal_symbol==Symbol() && deal_magic==Magic)
if(deal_entry==DEAL_ENTRY_OUT)
{
if(deal_profit>0)
{
//--- есть шанс, что это было закрытие по TakeProfit
if(StringFind(deal_comment,"tp",0)==-1)
return;
//--- если закрыли BUY
if(deal_type==DEAL_TYPE_SELL)
{
if(deal_volume>lot_sell)
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
//--- обнуление для BUY
bln_buy=false;
}
//--- если закрыли SELL
if(deal_type==DEAL_TYPE_BUY)
{
if(deal_volume>lot_buy)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
//--- обнуление для SELL
bln_sell=false;
}
}
}
}
}
Часть кода взята из данного советника - https://www.mql5.com/ru/code/17438
Sleep(stop_time); - никаких пауз в торговых операциях!
Это очень, очень, плохой способ.
"bar_1" и "bar" - это input параметры первого и второго бара?
Вот так:
писать нельзя. Нужно так:
нет, это не input параметры
double bar_1=bars_points_1*_Point;
вот input :
input int bars_points_1=80; // минимальный размер бара
Sleep(stop_time); - никаких пауз в торговых операциях!
Это очень, очень, плохой способ.
Вас понял.
А остальное по выборам позиций из истории корректно ?
Вас понял.
А остальное по выборам позиций из истории корректно ?
Нет.
Что это:
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
У вас может быть четыре сделки подряд, если "deal_volume>lot_sell": сначала сработает первое условие, потом сработает второе условие.
***
вот input :
input int bars_points_1=80; // минимальный размер бара
Лучше сразу называть параметры так, чтобы они несли смысловую нагрузку. Вместо bars_points и bars_points_1:
minimum_size_bar и maximum_size_bar
Нет.
Что это:
{
trade.Sell(lot_sell_1,_Symbol,0,0,0,CommentOrder);
trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
if(deal_profit>0)
{
trade.Buy(lot_buy_1,_Symbol,0,0,0,CommentOrder);
trade.Sell(Volume,_Symbol,0,0,0,CommentOrder);
Sleep(stop_time);
}
У вас может быть четыре сделки подряд, если "deal_volume>lot_sell": сначала сработает первое условие, потом сработает второе условие.
Не понимаю как сделать правильно.
То что я записал так:
это вообще как читается?
deal_volume - это по какой именно сделке берется обьем?
по последней?
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
{
total_buy=PositionTotal(POSITION_TYPE_BUY);
total_sell=PositionTotal(POSITION_TYPE_SELL);
}
//--- get transaction type as enumeration value
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
if(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_entry =0;
double deal_profit =0.0;
double deal_volume =0.0;
long deal_type =0;
string deal_symbol ="";
string deal_comment ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Хотел бы попросить опытных программистов подсказать что написано неверно.
Сейчас опишу сперва как все должно работать на самом деле:
1) Ждем закрытие свечи:
1.1) Если закрылась и мы определили что свеча бычья(медвежья) проверяем 1.2
1.2) Вычисляем размер свечи
1.3) Открываем 2 сделки(1 бай,1 селл) если размер свечи равен заданному диапазону, заданному в входных параметрах. (Если свеча медвежья - открываем бай по 0,03 селл по 0,01, для бычьей свечи наоборот)
2) Логика открытия следующих позиций ( с учетом того что свеча была медвежья)
2.1) Открыты сделки buy_1 по 0,03
sell_1 по 0,01
2.2) Если закрылась сделка бай по стоп лосс, открываем еще одну сделку buy_2 удвоенным лотом от начального объемом и 1 сделку sell_2 удвоенным объемом
2.3) Если закрылся селл по стоп лосс ничего не делаем, ждем закрытия селл
2.3) Если buy_2 закрылся по стоп лосс то открываем sell_3 объемом = (buy_1+buy_2+sell_1+sell_2)
2.4) Не учитываем закрытие по стоп лосс, когда стоп лосс приводит к положительному результату т.к был передвинут трейлинг стопом
2.5) При закрытии любой сделки по тейкпрофит далее ничего не делаем ждем сигнла
Ниже приложу части кода .