Советник только покупает, можете добавить выбор направления?
А дополнение к уже имеющимся функциям советника можно озвучить?
осталась проблема трала.
extern string s="------- Внешние параметры трала------------";
extern bool AllPositions = True; // Управлять всеми позициями
extern bool ProfitTrailing = True; // Тралить только профит
extern int TrailingStop = 0; // Фиксированный размер трала
extern int TrailingStep = 2; // Шаг трала
только этот трал работает когда ордера идут в прибыль.
Можно вас попросить добавить открытие ордера на пробитие сречи например пробил в низ дневную свечу открыл селл и наоборот, чтобы в тестере подобрать оптимальные параметры для каждой пары.
Кажется работает.
Но при выборе «0 — стопы на одной цене» ставит стопы отложек чуть больше стопа первого рыночного ордера на величину спреда.
//+------------------------------------------------------------------+
//| Pepelats.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property description "Simple expert advisor"
//--- Inputs
extern double Lots = 0.1; // лот
extern int Stops = 0; // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss = 500; // лось
extern int TakeProfit = 50; // язь
extern int Count = 5; // число отложек
extern int Step = 200; // спред
extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip = 30; // реквот
extern int Expiration = 30; // истечение отложек в часах
extern int BarsCount = 500; // баров для расчета индикатора
extern int MAPeriod = 100; // период МА
extern int Magic = 123; // магик
extern string IndName="MA_Chanels_FIBO";
double Stop=0;
datetime TimeOpen=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr;
double sl=0,tp=0;
datetime expiration=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(type>1 && Stops==0) sl=NormalizeDouble(Stop,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(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
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()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del=true;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()>1) del=OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Last()
{
int result=0;
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
{
if(OrderProfit()>0)
{
result=1;//tp
}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
datetime LastOrderOpenTime()
{
datetime t=0;
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
{
if(OrderProfit()>0)//tp
{
t=OrderOpenTime();
}
}
}
return(t);
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
int i=0;
double up=0,dn=0;
if(Buff==1)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
}
if(Buff==2)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
}
if(Buff==3)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
}
if(Buff==4)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
}
if(CountTrades()<1)
{
if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
{
PutOrder(0,Ask);
TimeOpen=TimeCurrent();
Stop=Ask-StopLoss*Point;
for(i=1; i<=Count;i++)
{
PutOrder(2,Ask-Step*Point*i);
}
}
if(Bid>up && CountOrders(3)<1)//селл и селл лимит
{
PutOrder(1,Bid);
TimeOpen=TimeCurrent();
Stop=Bid+StopLoss*Point;
for(i=1; i<=Count;i++)
{
PutOrder(3,Bid+Step*Point*i);
}
}
}
if(LastOrderOpenTime()>=TimeOpen)
{
DelOrder();
}
Comment("\n Stop: ",Stop);
}
//+------------------------------------------------------------------+
Можно изменить это условие?
При первом же тейке любого ордера сетки все отложки удаляются. Неважно какой по счету ордер тейкнулся. Есть один тейк — все отложки удаляются.
Можно изменить это условие?
При первом же тейке любого ордера сетки все отложки удаляются. Неважно какой по счету ордер тейкнулся. Есть один тейк — все отложки удаляются.
В моем новом индикаторе мы можем поставить значение fibo_red=61.8 (и красная линия будет как в старом индюке), так и 97, так и 122, т.е. абсолютно независимые фибо-значения, в отличии от старого варианта.
extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5
Улучшения по пунктам:
1. Неправильно ставятся стопы у лимитных ордеров. Стоп у всей сетки должен быть один, на цене стопа первого рыночного ордера. В этом варианте у каждого ордера свой стоп в 500 пунктов от цены их открытия.
Лучше даже оставить два варианта на выбор. Один как сейчас, а другой с единым стопом. Что то типа переменной:
Единый стоп у всех ордеров: true/false
false — нынешний вариант, у каждого отложенника свой стоп
true — стопы всех отложек на цене стопа первого рыночного ордера
2. Настройка уровня отбоя (крайне важная штука). По умолчанию в индикаторе стоит 61,8%, который рисуется красной линией. Я сейчас переделал индикатор в силу своих способностей, там эти уровни задаются переменными: www.opentraders.ru/downloads/1012/
В моем индикаторе есть переменная fibo_red=61.8
Можно ее вынести в советника? Она отвечает как раз за эту отбойную линию.
3. Если по тейку закрывается первый ордер (с которого началась сетка), то все отложенники удаляются. Это очень важное правило!
//+------------------------------------------------------------------+
//| Pepelats.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property description "Simple expert advisor"
//--- Inputs
extern double Lots = 0.1; // лот
extern int Stops = 0; // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss = 500; // лось
extern int TakeProfit = 50; // язь
extern int Count = 5; // число отложек
extern int Step = 200; // спред
extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip = 30; // реквот
extern int Expiration = 30; // истечение отложек в часах
extern int BarsCount = 500; // баров для расчета индикатора
extern int MAPeriod = 100; // период МА
extern int Magic = 123; // магик
extern string IndName="MA_Chanels_FIBO";
int Type=0;
double Price=0,Stop=0,Take=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr;
double sl=0,tp=0;
datetime expiration=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
if(type>1 && Stops==0) sl=NormalizeDouble(Ask+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(type>1 && Stops==0) sl=NormalizeDouble(Bid-StopLoss*Point,Digits);
if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
}
if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountOrders(int type)
{
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()==type) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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()==OP_BUY || OrderType()==OP_SELL) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del=true;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
{
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()==OP_BUYSTOP) del=OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
if(OrderType()==OP_BUYLIMIT) del=OrderDelete(OrderTicket());
if(OrderType()==OP_SELLLIMIT) del=OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Last()
{
int result=0;
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
{
if(OrderProfit()>0)
{
result=1;//tp
}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
int i=0;
double up=0,dn=0;
if(Buff==1)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
}
if(Buff==2)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
}
if(Buff==3)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
}
if(Buff==4)
{
up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
}
if(CountTrades()<1)
{
if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
{
PutOrder(0,Ask);
Price=Ask;
Type=0;
for(i=1; i<=Count;i++)
{
PutOrder(2,Ask-Step*Point*i);
}
}
if(Bid>up && CountOrders(3)<1)//селл и селл лимит
{
PutOrder(1,Bid);
Price=Bid;
Type=1;
for(i=1; i<=Count;i++)
{
PutOrder(3,Bid+Step*Point*i);
}
}
}
if(Last()==1 && ((Bid>=Price+TakeProfit*Point && Type==0) || (Ask<=Price-TakeProfit*Point && Type==1))) DelOrder();
Comment("\n Price: ",Price,
"\n Type: ",Type);
}
//+------------------------------------------------------------------+
AM2