Помогите переделать советник

 
Не силен я в MQ4, помогите доделать советник, в данный момент
он работает с переворотом а нужно сделать следующие
если i1>i2 открыть позицию SELL
если i1<i2 закрыть позицию SELL
если i3>i4 открыть позицию BUY
если i3<i4 закрыть позицию BUY
// eSOV.mq4
#include <stdlib.mqh>
extern int Magic = 1;
extern int sov=3;
extern double Lots = 0.1;
 
int order_MgcNum=0, err=0, ticket=0;
bool result = True;
 
int start() {
int total,cnt,pos,order;
string order_comment = Symbol()+", Period "+Period()+", eSOV  "+Magic;
 
double i1=iCustom(NULL,0,"iSOV",sov,0,1);
double i2=iCustom(NULL,0,"iSOV",sov,1,1);
double i3=iCustom(NULL,0,"iSOV",sov,2,1);
double i4=iCustom(NULL,0,"iSOV",sov,3,1);
 
if  (i1>i2) {
    total=OrdersTotal(); pos=0;
    for (cnt=0;cnt<total;cnt++) {
        OrderSelect(cnt, SELECT_BY_POS);
        if ((OrderSymbol() == Symbol())&&(OrderMagicNumber()==Magic)) {
            order=OrderTicket(); pos=1;
            if (IsTradeAllowed() && (OrderType() == OP_BUY)) { 
               RefreshRates();// Новые Аск и Бид
               result = OrderClose(order,Lots,Bid,3);
               if (!result) {
                  err=GetLastError(); Print("Error(",err,") closing Long (BUY) : ",ErrorDescription(err));
                  } return(0);
               }
            }
        }
    if ((pos==0) && IsTradeAllowed()) {
        RefreshRates();// открытие с рынка
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,order_comment,Magic,0);
        if (ticket>0) {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
               Print("Order opened : ",OrderOpenPrice()); 
            } else {
               err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
               }
            }        
        }
    }
 
if (i1<i2) { 
    total=OrdersTotal(); pos=0;
    for (cnt=0;cnt<total;cnt++) {
        OrderSelect(cnt, SELECT_BY_POS );
        if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)) {
            order=OrderTicket(); pos=1;
            if (IsTradeAllowed()&& (OrderType() == OP_SELL)) {
               RefreshRates();// Новые Аск и Бид
               result = OrderClose(order,Lots,Ask,3);
               if(!result){
                  err=GetLastError(); Print("Error(",err,") closing Short (SELL) : ",ErrorDescription(err));
                  } return(0);
               }
            }
        }
    if ((pos==0) && IsTradeAllowed()) {
        RefreshRates();// открытие с рынка
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,order_comment,Magic,0);
        if( ticket>0 ) {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
               Print("Order opened : ",OrderOpenPrice()); 
            } else {
               err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
               }
            }        
        }
    }
return(0);
}
 

Что делать, если одновременно будет например:

i1>i2 и i3>i4 или i1<i2 и i3<i4 .

Варианты могут быть разные. А без кода индикатора на такой ответ никто не даст ответ.

Не для себя, для других спрашиваю.

Нужно сформулировать более точно задание и желательно предусмотреть все возможные варианты, а то программист виноват будет.

 
Vinin:

Что делать, если одновременно будет например:

i1>i2 и i3>i4 или i1<i2 и i3<i4 .

Варианты могут быть разные. А без кода индикатора на такой ответ никто не даст ответ.

Не для себя, для других спрашиваю.

Нужно сформулировать более точно задание и желательно предусмотреть все возможные варианты, а то программист виноват будет.

Вот попытался сам переделать, не знаю насколько правильно, сам сигнальный модуль работает как надо,
иногда по системе нужно открыть одновременно два ордера селл и бай одновременно, как с этой ситуацией он будет справляться ?
нужно чтобы модуль селл и бай работали не зависимо друг от друга и вообще насколько корректно написан данный советник,
для круглосуточной работы, очень бы хотелось выслушать замечания от ГУРУ!
 // eSOV.mq4
#include <stdlib.mqh>
 
extern int Magic = 1; // для каждого эксперта должен быть свой !
extern int zr = 3;
extern double Lots = 0.1;
 
int order_MgcNum=0, err=0, ticket=0;
bool result = True;
 
int start()
{
   int total,cnt,pos,order;
   string order_comment = Symbol()+", Period "+Period()+", eSOV  "+Magic;
 
      double i1=iCustom(NULL,0,"iSOV",zr,0,1);
      double i2=iCustom(NULL,0,"iSOV",zr,0,2);
      double i3=iCustom(NULL,0,"iSOV",zr,1,1);
      double i4=iCustom(NULL,0,"iSOV",zr,1,2);
      double i5=iCustom(NULL,0,"iSOV",zr,2,1);
      double i6=iCustom(NULL,0,"iSOV",zr,2,2);
 
// Open SELL
if ((i5>i6) && (i1>i2)) {
   if ((pos==0) && IsTradeAllowed()) {
      RefreshRates();// открытие с рынка
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,order_comment,Magic,0);
      if (ticket>0) {
         if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
            Print("Order opened : ",OrderOpenPrice()); 
            } else {
            err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
            } return(0);
         }        
      }
   }
//Open BUY
   if ((i3>i4) && (i1>i2)) {
      if ((pos==0) && IsTradeAllowed()) {
      RefreshRates();// открытие с рынка
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,order_comment,Magic,0);
      if (ticket>0) {
         if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
            Print("Order opened : ",OrderOpenPrice()); 
            } else {
            err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
            } return(0);
          }        
       }
    }
// Close SELL
if ((i5<i6) && (i1<i2)) {
   total=OrdersTotal(); pos=0;
   for (cnt=0;cnt<total;cnt++) {
     OrderSelect(cnt, SELECT_BY_POS );
     if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)) {
        order=OrderTicket(); pos=1;
        if (IsTradeAllowed()&& (OrderType() == OP_SELL)) {
           RefreshRates();// Новые Аск и Бид
           result = OrderClose(order,Lots,Ask,3);
           if (!result) {
              err=GetLastError(); Print("Error(",err,") closing Short (SELL) : ",ErrorDescription(err));
              } return(0);
            }
         }
      }
   }
//Close BUY
if ((i3<i4) && (i1<i2)) {
   total=OrdersTotal(); pos=0;
   for (cnt=0;cnt<total;cnt++) {
     OrderSelect(cnt, SELECT_BY_POS);
     if ((OrderSymbol() == Symbol())&&(OrderMagicNumber()==Magic)) {
        order=OrderTicket(); pos=1;
        if (IsTradeAllowed() && (OrderType() == OP_BUY)) { 
           RefreshRates();// Новые Аск и Бид
           result = OrderClose(order,Lots,Bid,3);
           if (!result) {
              err=GetLastError(); Print("Error(",err,") closing Long (BUY) : ",ErrorDescription(err));
              } return(0);
            }
         }
      }
   }
return(0);
}
 
А тестировать не пробовал. Может половина вопросов исчезнет. Но появятся другие.
 
Vinin:

А тестировать не пробовал. Может половина вопросов исчезнет. Но появятся другие.

Пробовал, вроде все нармально, а вот в реале не совсем, открывает несколько ордеров, хотя должен только один,
или максимум два но только один селл и один бай! Торгашу тяжело дается програмирование :)
 
Наверное все дело в переменной pos, посмотри может разберешся
 
sashken:
Наверное все дело в переменной pos, посмотри может разберешся

Спасибо уважаемый за отклик, но ссылки к моему сожалению мне не помогли, очень я далек от программирования,

попробовал методом тыка :) но нужного результата нет ! ткните носом если не затруднит !

// eSOV.mq4
#include <stdlib.mqh>

extern int Magic = 1; // для каждого эксперта должен быть свой !
extern int zr = 3;
extern double Lots = 0.1;

int order_MgcNum=0, err=0, ticket=0;
bool result = True;

int start()
{
int total,cnt,pos,order;
string order_comment = Symbol()+", Period "+Period()+", eSOV "+Magic;

double i1=iCustom(NULL,0,"iSOV",zr,0,1);
double i2=iCustom(NULL,0,"iSOV",zr,0,2);
double i3=iCustom(NULL,0,"iSOV",zr,1,1);
double i4=iCustom(NULL,0,"iSOV",zr,1,2);
double i5=iCustom(NULL,0,"iSOV",zr,2,1);
double i6=iCustom(NULL,0,"iSOV",zr,2,2);

// Open SELL
if ((i5>i6) && (i1>i2)) {
if ((pos==0) && IsTradeAllowed()) {
RefreshRates();// открытие с рынка
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,order_comment,Magic,0);
pos=1;
if (ticket>0) {
if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
Print("Order opened : ",OrderOpenPrice());
} else {
err = GetLastError(); Print("Error(",err,") opening order : ", ErrorDescription(err));
} return(0);
}
}
}
//Open BUY
if ((i3>i4) && (i1>i2)) {
if ((pos==0) && IsTradeAllowed()) {
RefreshRates();// открытие с рынка
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,order_comment,Magic,0);
pos=1;
if (ticket>0) {
if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
Print("Order opened : ",OrderOpenPrice());
} else {
err = GetLastError(); Print("Error(",err,") opening order : ", ErrorDescription(err));
} return(0);
}
}
}
// Close SELL
if ((i5<i6) && (i1<i2)) {
total=OrdersTotal(); pos=0;
for (cnt=0;cnt<total;cnt++) {
OrderSelect(cnt, SELECT_BY_POS );
if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)) {
order=OrderTicket(); pos=0;
if (IsTradeAllowed()&& (OrderType() == OP_SELL)) {
RefreshRates();// Новые Аск и Бид
result = OrderClose(order,Lots,Ask,3);
if (!result) {
err=GetLastError(); Print("Error(",err,") closing Short (SELL) : ",ErrorDescription(err));
} return(0);
}
}
}
}
//Close BUY
if ((i3<i4) && (i1<i2)) {
total=OrdersTotal(); pos=0;
for (cnt=0;cnt<total;cnt++) {
OrderSelect(cnt, SELECT_BY_POS);
if ((OrderSymbol() == Symbol())&&(OrderMagicNumber()==Magic)) {
order=OrderTicket(); pos=0;
if (IsTradeAllowed() && (OrderType() == OP_BUY)) {
RefreshRates();// Новые Аск и Бид
result = OrderClose(order,Lots,Bid,3);
if (!result) {
err=GetLastError(); Print("Error(",err,") closing Long (BUY) : ", ErrorDescription(err));
} return(0);
}
}
}
}
return(0);
}
 
// eSOV.mq4
#include <stdlib.mqh>
 
extern int Magic = 1; // для каждого эксперта должен быть свой !
extern int zr = 3;
extern double Lots = 0.1;
 
int order_MgcNum=0, err=0, ticket=0;
bool result = True;
int posB=0;
int posS=0;
 
 
int init()
  {
//----
  
 
 
//----
   return(0);
  }
 
 
int start()
{
   int total,cnt,order;
   string order_comment = Symbol()+", Period "+Period()+", eSOV  "+Magic;
 
////////////////////////////////////////////////////////////////////////////////////////
 
// Сюда добавить проверку нового бара, чтобы на одном баре по "сто" сделок не открывал
 
// Сюда добавить проверку (перебор) открытых ордеров с нашим Magic
// и присвоением переменных posB, posS
 
////////////////////////////////////////////////////////////////////////////////////////
 
 
      double i1=iCustom(NULL,0,"iSOV",zr,0,1);
      double i2=iCustom(NULL,0,"iSOV",zr,0,2);
      double i3=iCustom(NULL,0,"iSOV",zr,1,1);
      double i4=iCustom(NULL,0,"iSOV",zr,1,2);
      double i5=iCustom(NULL,0,"iSOV",zr,2,1);
      double i6=iCustom(NULL,0,"iSOV",zr,2,2);
 
// Open SELL
if ((i5>i6) && (i1>i2)) {
   if ((posS==0) && IsTradeAllowed()) {
      RefreshRates();// открытие с рынка
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,order_comment,Magic,0);
      
      if (ticket>0) {
         if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
            Print("Order opened : ",OrderOpenPrice()); 
            posS=1;
            } else {
            err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
            } return(0);
         }        
      }
   }
//Open BUY
   if ((i3>i4) && (i1>i2)) {
      if ((posB==0) && IsTradeAllowed()) {
      RefreshRates();// открытие с рынка
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,order_comment,Magic,0);
      
      if (ticket>0) {
         if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
            Print("Order opened : ",OrderOpenPrice()); 
            posB=1;
            } else {
            err = GetLastError(); Print("Error(",err,") opening order : ",ErrorDescription(err)); 
            } return(0);
          }        
       }
    }
// Close SELL
if ((i5<i6) && (i1<i2)) {
   total=OrdersTotal(); 
   for (cnt=0;cnt<total;cnt++) {
     OrderSelect(cnt, SELECT_BY_POS );
     if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)) {
        order=OrderTicket();
        if (IsTradeAllowed()&& (OrderType() == OP_SELL)) {
           RefreshRates();// Новые Аск и Бид
           result = OrderClose(order,Lots,Ask,3);
           if (result) {posS=0;}
           if (!result) {
              err=GetLastError(); Print("Error(",err,") closing Short (SELL) : ",ErrorDescription(err));
              } return(0);
            }
         }
      }
   }
//Close BUY
if ((i3<i4) && (i1<i2)) {
   total=OrdersTotal();
   for (cnt=0;cnt<total;cnt++) {
     OrderSelect(cnt, SELECT_BY_POS);
     if ((OrderSymbol() == Symbol())&&(OrderMagicNumber()==Magic)) {
        order=OrderTicket();
        if (IsTradeAllowed() && (OrderType() == OP_BUY)) { 
           RefreshRates();// Новые Аск и Бид
           result = OrderClose(order,Lots,Bid,3);
           if (result) {posB=0;}
           if (!result) {
              err=GetLastError(); Print("Error(",err,") closing Long (BUY) : ",ErrorDescription(err));
              } return(0);
            }
         }
      }
   }
return(0);
}
Выложи индикатор(сигнальный модуль) Тогда и "носом ткнут" :)
 
Ну вроде разобрался, все работает, всем спасибо за участие !
Причина обращения: