Доработка совы (по мартингейлу) |
//+------------------------------------------------------------------+
//| ExBB.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, AM2"
#property link "http://www.forexsystems.biz"
#property description "BBands expert advisor"
//--- Inputs
extern double Lots = 0.1; // лот
extern double KLot = 2; // умножение лота
extern double MaxLot = 5; // максимальный лот
extern int StopLoss = 5000; // лось
extern int TakeProfit = 5000; // язь
extern double Profit = 50; // язь в рублях
extern int Shift = 1; // сдвиг
extern int Slip = 30; // слипаж
//----
extern string IndName = "BBands_Stop_v1";
extern int Length = 20; // период BB
extern int Deviation = 2; // отклонение ВВ
extern double MoneyRisk = 1; // риск
extern int Magic = 20; // магик
datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
int count=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
if(lot>MaxLot)lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double AllProfit()
{
double profit=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2) profit+=OrderProfit()+OrderSwap()+OrderCommission();
}
}
}
return (profit);
}
//+------------------------------------------------------------------+
//| Результат последней сделки |
//+------------------------------------------------------------------+
int LastDealResult()
{
int result=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()>0)
{
result=1;//tp
break;
}
}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void OpenPos()
{
//--- get Ind
double BBBlue=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,0,Shift);
double BBRed=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,1,Shift);
double BBBlue2=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,0,Shift+1);
double BBRed2=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,1,Shift+1);
//--- sell conditions
if(BBRed>0 && BBBlue2>0)
{
PutOrder(1,Bid);
}
//--- buy conditions
if(BBBlue>0 && BBRed2>0)
{
PutOrder(0,Ask);
}
//---
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void Open2Pos()
{
//--- get Ind
double BBBlue=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,0,Shift);
double BBRed=iCustom(NULL,0,IndName,Length,Deviation,MoneyRisk,1,Shift);
bool buy = BBBlue>0;
bool sell = BBRed>0;
//--- sell conditions
if(sell)
{
PutOrder(1,Bid);
}
//--- buy conditions
if(buy)
{
PutOrder(0,Ask);
}
//---
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(LastDealResult()==1 && CountTrades()<1) Open2Pos();
if(t!=Time[0])
{
OpenPos();
t=Time[0];
}
if(CountTrades()>1 && AllProfit()>Profit) CloseAll();
Comment("\n Profit: ",AllProfit(),
"\n Last Deal Result: ",LastDealResult());
}
//+------------------------------------------------------------------+
Следующая запись в группе Автоматизация стратегии по книге Джона Дж. Мэрфи "Визуальный инвестор. Как определять тренды" |
|
05 декабря 2016
|
06 декабря 2016
|
Комментарии (21)
35 AM2 Сообщений: 16274 - Андрей
Имелось в виду ЗАПРЕТ на одно направление, а не на оба сразу…, хотя вариант: на оба сразу, тоже возможен, когда обе линии находятся в данном диапазоне уровней.
-Да, и если будет 3) пункт- функция времени, то должна быть отключаемая в настройках. Редактирован: 6 декабря 2016, 19:42
19 Marik007 Автор Сообщений: 417 - Forexman
35 AM2 Сообщений: 16274 - Андрей
Советник какое то время идет нормально но потом попадает вот в такую полосу:
Редактирован: 6 декабря 2016, 21:30
35 AM2 Сообщений: 16274 - Андрей
Только не большое изменение:
1) Функция открытия нового ордера, сразу же после закрытия серии ордеров или текущего ордера, должна быть отключаемая.Переменная в настройки- вкл/откл
2)Открытие любого ордера проходит через фильтр индюка Level1, Level2.… ну и далее все по ТЗ.
Эти переменные: ( «BBands_Stop_v1»;
extern int Length = 20; // период BB
extern int Deviation = 2; // отклонение ВВ
extern double MoneyRisk = 1; // риск
нужны в настройках совы… все как было в исходном коде!
А так же в настройках нужны параметры (FL23_Decompil):
extern string Notealerts = "-----Alert Settings-----";
extern bool MsgAlerts = TRUE;
extern bool SoundAlerts = TRUE;
extern string SoundAlertFile = «alert.wave»;
extern bool eMailAlerts = FALSE;
int G_bars_104;
extern int BarsCount = 17;
И по поводу временного блока, не знаю в вашем варианте будет ли сохраняться, то что я просил в 3) пункте ТЗ?
Редактирован: 6 декабря 2016, 21:32
19 Marik007 Автор Сообщений: 417 - Forexman
Желательно со скринами все делать, чтобы не было подобных недоразумений о чем я и просил в самом начале, поэтому я повторяю свой вопрос?
Как это? Редактирован: 6 декабря 2016, 21:41
35 AM2 Сообщений: 16274 - Андрей
Андрей, вот здесь подробное описание исходной совы которую Вы мне собирали. Новую сову собирать не нужно!, только допилить старую!
Нужно эту функцию: «открытия нового ордера», сделать отключаемую.Эту функцию в настройки — вкл/откл
Если отключено то ждем нового сигнала на вход от индикатора BBands_Stop_v1
Например: from new order- true/false
Редактирован: 7 декабря 2016, 00:42
19 Marik007 Автор Сообщений: 417 - Forexman
За основу нужно взять сову в ТЗ и к ней прикрутить все по моему описанию…
Если я, что то не понятно написал, то я готов терпеливо объяснить и изложить свои мысли, что бы помочь Вам в реализации мной задуманного.
Вы, уж пожалуйста не сердитесь на меня, если я что то не так излагаю (давайте спишим на мой пенсионный возраст) Я буду стараться Вам помочь, всем чем только смогу..., только бы получить задуманный конечный результат по тех. заданию.
19 Marik007 Автор Сообщений: 417 - Forexman
С «Блоком времени», возможны варианты, может у Вас свое виденье реализации 3)-го пункта ТЗ. Но он обязательно должен быть отключаемый.
Андрей, если Вам сложно или покажется слишком много, то 3-й пункт ТЗ можно не делать.
Главное реализовать 1-й и 2-й пункты ТЗ!!! ЭТО ОСНОВНОЕ!
Повторюсь еще раз: ЗДЕСЬ описание исходной совы которую Вы мне собирали, которую нужно допилить по ТЗ.
19 Marik007 Автор Сообщений: 417 - Forexman
35 AM2 Сообщений: 16274 - Андрей
19 Marik007 Автор Сообщений: 417 - Forexman
35 AM2 Сообщений: 16274 - Андрей
У меня пока один вопрос: --как работает TrailingStop в моем варианте, при каком то заданном значении? Потому как одна переменная нет ни шага не чего более?
19 Marik007 Автор Сообщений: 417 - Forexman
35 AM2 Сообщений: 16274 - Андрей
--Что бы TrailingStop работал только тогда, когда открыт один ордер! Если появляется второй (включается мартин) то TrailingStop-отключается (прекращает тралить), так как если он будет тралить все ордера, может нарушится работа мартина и появятся зависшие ордера…
Ну и,(если не сложно) что бы больше не возвращаться к тралу сделайте его отключаемым: TrailingStop = true/false (вынести в настройки)
19 Marik007 Автор Сообщений: 417 - Forexman
19 Marik007 Автор Сообщений: 417 - Forexman
35 AM2 Сообщений: 16274 - Андрей
35 AM2 Сообщений: 16274 - Андрей
19 Marik007 Автор Сообщений: 417 - Forexman
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий