Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 35

 

Здравствуйте!
Чтобы исправить индикатор, нужно было заменить все точки "." на пусто "".

Файлы:
supDem.zip  68 kb
 

Приветствую.

В написанной функции подсчета определенных ордеров в функции выбора ордера изменил тип выбора с выбора по порядку на выбор по тикету.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

После этого при запуске несколько десятков свечей все отрабатывается корректно а после в журнал идут, повторяясь, ошибки:

2016.12.17 17:44:31.609 2016.12.07 00:27  test3 EURUSD,M1: unknown ticket 2 for OrderModify function

2016.12.17 17:44:31.608 2016.12.07 00:25  test3 EURUSD,M1: OrderModify error 4108   // Неверный номер тикета.

Вот полный текст, менял соотв во всех четырех функциях:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


И тут есть один момент - после изменения функции выбора ошибку стала выдавать функция модификации ордера и только через какое-то время после запуска тестирования, сначала все нормально.

Почему так происходит и как с этим бороться?


 
spoiltboy:

Приветствую.

В написанной функции подсчета определенных ордеров в функции выбора ордера изменил тип выбора с выбора по порядку на выбор по тикету.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

После этого при запуске несколько десятков свечей все отрабатывается корректно а после в журнал идут, повторяясь, ошибки:

2016.12.17 17:44:31.609 2016.12.07 00:27  test3 EURUSD,M1: unknown ticket 2 for OrderModify function

2016.12.17 17:44:31.608 2016.12.07 00:25  test3 EURUSD,M1: OrderModify error 4108   // Неверный номер тикета.

Вот полный текст, менял соотв во всех четырех функциях:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


И тут есть один момент - после изменения функции выбора ошибку стала выдавать функция модификации ордера и только через какое-то время после запуска тестирования, сначала все нормально.

Почему так происходит и как с этим бороться?


 Ошибку эту скорее всего вы получаете, потому что пытаетесь модифицировать отложник который уже либо сработал либо удален. Нужно обнулять переменные где хранятся тикеты отложек, например когда сработал отложенный ордер.
 
Sergey Gritsay:
 Ошибку эту скорее всего вы получаете, потому что пытаетесь модифицировать отложник который уже либо сработал либо удален. Нужно обнулять переменные где хранятся тикеты отложек, например когда сработал отложенный ордер.
Не подскажете как это правильно оформить? А то что-то никак не выходит.
 

Всем привет, подсобите разобраться, чего не так.

советник открывает ордер          ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0,"AV2",1111,0,Green);

закрываем МТ4, открываем МТ4 идет проверка предыдущей работы советника

 

   for(int prev=0; prev<OrdersTotal();prev++) //Проверка предыдущей работы эксперта

     {

      ViborOrdera=OrderSelect(prev,SELECT_BY_POS);

      if(OrderSymbol()==Symbol())

//*************************************

//-------Проверка цикла Покупок--------  

      if (OrderType()==OP_BUY && OrderMagicNumber()==1111)

       {

        PriceAsk=OrderOpenPrice();//Цена открытия, нужна для дальнейшей работы советника

       }

вопрос, где ошибка, не идет проверка? заход в цикл не происходит. Тело цикла находится в Ините.

 

Времени нет разбираться..........

Попробуйте почитать и расставить в нужных местах  

bool  RefreshRates();

///
 
ed3sss:

Всем привет, подсобите разобраться, чего не так.

советник открывает ордер          ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0,"AV2",1111,0,Green);

закрываем МТ4, открываем МТ4 идет проверка предыдущей работы советника

 


вопрос, где ошибка, не идет проверка? заход в цикл не происходит. Тело цикла находится в Ините.

А докажите, что именно в цикл не заходит. Кроме того, зачем проверять ВСЕ ордера, от самого начала жизни счёта, если нужны последние???
 
Mikhail Kozhemyako:

Времени нет разбираться..........

Попробуйте почитать и расставить в нужных местах  

bool  RefreshRates();

///
Не помогло(
 
Vitalie Postolache:
А докажите, что именно в цикл не заходит. Кроме того, зачем проверять ВСЕ ордера, от самого начала жизни счёта, если нужны последние???

  Доказательство: Print("Предыдущая работа PriceAsk-",PriceAsk); в журнале пусто.

Кроме того, зачем проверять ВСЕ ордера, от самого начала жизни счёта, если нужны последние??? - а как по другому сделать, если открыто 10 валютных пар? 


 

Было все ок, пока не изменили в МQL это ViborOrdera=OrderSelect(prev,SELECT_BY_POS);

Раньше было так OrderSelect(prev,SELECT_BY_POS);. Давно было) но работало.