- [АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3.
- Напишу советник бесплатно
- Вопросы от начинающих MQL5 MT5 MetaTrader 5
По тренду работает. У вас очень хороший советник, кстати, грех жаловаться!
//| expert_victor_bar1.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
extern int TP=80,SL=40,TS=15,shift=40;
extern double lots=0.1;
double victor,abc;
bool ordb,ords;
int TotalOrders,pos,times,timeb,ps,pb;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
ords=false; ordb=false;
for(pos=0;pos<TotalOrders;pos++) {
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) && OrderSymbol()==Symbol()) ords=true;
if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP) && OrderSymbol()==Symbol()) ordb=true;
}
victor=0;
victor=iCustom(NULL,0,"1244",0,1);
abc=iCustom(NULL,0,"1244",1,1);
if (victor>0 && !ords)
{
ps=OrderSend(Symbol(),OP_SELLSTOP,lots,Low[1]-shift*Point,0,Low[1]-(shift-SL)*Point,Low[1]-(shift+TP)*Point,0,0,0,Blue);
ords=true;
Sleep(5000);
times=Time[0];
}
if (victor>0 && !ordb)
{
pb=OrderSend(Symbol(),OP_BUYSTOP,lots,High[1]+shift*Point,0,High[1]+(shift-SL)*Point,High[1]+(shift+TP)*Point,0,0,0,Blue);
ordb=true;
Sleep(5000);
timeb=Time[0];
}
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}
TotalOrders=OrdersTotal();
if(TotalOrders<1) {
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(pos=0;pos<TotalOrders;pos++) {
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY) {
// check for trailing stop
if(TS>0) {
if(Bid-OrderOpenPrice()>Point*TS) {
if(OrderStopLoss()<Bid-Point*TS) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TS,OrderTakeProfit(),0,Green);
return(0);
}
}
}
} else {
// check for trailing stop
if(TS>0) {
if((OrderOpenPrice()-Ask)>(Point*TS)) {
if((OrderStopLoss()>(Ask+Point*TS)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TS,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
1. а что пишется в журнале? есть ли ошибки?
одну явно могу сказать - реквот. а то что он не открывает во втором направлении.. пока не ясно.
2. Вот тут
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}
могут быть проблемы с удалением ордеров Buy и Sell
3. Если у вас эти параметры используются для пятизнаков - то может не разрешать стопуровень ставить так близко ордера.
Надо сначала проверяит тп и сл на правильность.
А ещё лучше уберите для начала из ордера стоплос и тейкпрофит. Может в них и проблема
4. Нормализируйте цены.
1. а что пишется в журнале? есть ли ошибки?
одну явно могу сказать - реквот. а то что он не открывает во втором направлении.. пока не ясно.
2. Вот тут
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}
могут быть проблемы с удалением ордеров Buy и Sell
3. Если у вас эти параметры используются для пятизнаков - то может не разрешать стопуровень ставить так близко ордера.
Надо сначала проверяит тп и сл на правильность.
А ещё лучше уберите для начала из ордера стоплос и тейкпрофит. Может в них и проблема
4. Нормализируйте цены.
Алексей,спасибо!!Вроде разобрался.Действительно,проблема с величиной стопа и открытия ордера.И проблема с ордерами.Т.е.советник ставит два ордера и если один сработал,то другой еще в режиме ожидания,но если вновь появился сигнал по индикатору "1244",то советник не удаляет "старый" ордер,а ставит тот,которого не хватает.Т.е.,если в данный момент покупка,то ставит продажу и наоборот.
Т.е.советник ставит два ордера и если один сработал,то другой еще в режиме ожидания,но если вновь появился сигнал по индикатору "1244",то советник не удаляет "старый" ордер,а ставит тот,которого не хватает.Т.е.,если в данный момент покупка,то ставит продажу и наоборот.
так это ошибка или так и надо?
за удаление отложенного ордера отвечает вот эти строки
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}
но у вас в коде нигде нет удаления открытых ордеров.
так это ошибка или так и надо?
за удаление отложенного ордера отвечает вот эти строки
if (victor>0 && ords && times!=Time[0]) {OrderDelete(ps);ps=0;}
if (victor>0 && ordb && timeb!=Time[0]) {OrderDelete(pb);pb=0;}
но у вас в коде нигде нет удаления открытых ордеров.
конечно было бы лучше,если бы при появлении сигнала,"старые"ордера удалялись,а новые устанавливались!
У вас немного не правильная просьба, так как сигнал существует в течении нескольких тиков. А следовательно на каждом тике ордер будет удалятся и менятся на отложку..
сформулируйте для начала правильно алгоритм.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования