[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 394

 

Все правильно!!!! Если нужніх ордеров нет, с нужным магикнумером X остается равным нолю, и тогда далее они открываюця. Если есть,X равно 2 и более ордера не открываюца.

Так в чем же еще дело?

- в самый первый момент вы выбираете ордер которого нету функцией OrderSelect Ну и что,нету и нету, значит на первом тике в этом цикле X остается равным нолю останеца.

в первом же цикле for(int Uy=OrdersTotal();Uy<=-1;Uy--) Ну и что,ну цикл больше побегает для надеги, потом я менял,на 0, изменений в работе нет, это все не ошибки, они не меняют,извиняюсь.

 
Вставил алерт, чтоб отследить работу цикла. Ничего не понимаю. Переменная, которая в цикле,тока раз пишется, в начале,со значением 0, и все, дальше тока селл стоп 0 и бай стоп 130, что тоже край удивительно, они ж симетричны!!!! А через 2,5 метра надписи пишет уже тока ошибка 148.(брокер запрещает много ордеров)
//+------------------------------------------------------------------+
//|                                                    для лавин.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double stoploss=0; extern double takeprofit=20;extern int otstup=20; extern datetime expiration=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int tiket,tikett;double volume=0.1;int i=0,R1=0,R2=0,A=1 ;double price=PRICE_OPEN;
   //  R1=((PRICE_OPEN- stoploss*Point)*stoploss)/stoploss;R2=((PRICE_OPEN+ stoploss*Point)*stoploss)/stoploss;
     
     
int start()
  {       int X;       
//----
       for(int Uy=OrdersTotal();Uy==0;Uy--){
OrderSelect( Uy,SELECT_BY_POS );Alert ("Uy",Uy);
if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000||OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol())
{X ++;}}  
if (X<=2){
   tiket= OrderSend( Symbol(), OP_BUYSTOP,  volume*A, price +otstup*Point, Point* 3, R1, PRICE_OPEN+takeprofit*Point+otstup*Point, "OP_BUYSTOP", 1000,  expiration, Red); 
   Alert ("OP_BUYSTOP", GetLastError( )); 
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, price -otstup*Point, Point* 3,R2, PRICE_OPEN-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
    Alert ("OP_SELLSTOP", GetLastError( )); 
    }       
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Во,какая ерунда. А сначала всякий раз дата еррор пишет,примерно 49 раз.Да!!!! X всегда остается 0, и пишется нормально. Через 2 ордера.

 
PRICE_OPEN !!!! - так использовать эту цену нельзя! Она работает только для индикаторов. Используйте Бид или Аск.
 
Dimka-novitsek:

Все правильно!!!! Если нужніх ордеров нет, с нужным магикнумером X остается равным нолю, и тогда далее они открываюця. Если есть,X равно 2 и более ордера не открываюца.

Так в чем же еще дело?

- в самый первый момент вы выбираете ордер которого нету функцией OrderSelect Ну и что,нету и нету, значит на первом тике в этом цикле X остается равным нолю останеца.

в первом же цикле for(int Uy=OrdersTotal();Uy<=-1;Uy--) Ну и что,ну цикл больше побегает для надеги, потом я менял,на 0, изменений в работе нет, это все не ошибки, они не меняют,извиняюсь.

каким образом он может больше пробежать то?

сколько бы ордеров открыто не было, условие Uy<=-1 не выполняется сразу же, потому что количество ордеров больше или равно нулю сразу же

 

Помогите найти ошибку,

Спасибо

void TrailPositions()
{
//-----
  double BuySL = NormalizeDouble(iCustom(NULL,0,"NRTR",AveragePeriod,0,1),Digits);
  double SelSL = NormalizeDouble(iCustom(NULL,0,"NRTR",AveragePeriod,1,1),Digits);
//-----
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++)
  {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
    {
      if(OrderType() == OP_BUY && OrderMagicNumber()==Magic && OrderStopLoss() != BuySL*Point
      && BuySL*Point > OrderStopLoss())// && BuySL*Point > OrderOpenPrice())
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),BuySL*Point,OrderTakeProfit(),0,CLR_NONE);
        if(UseSound == true)
        {
        PlaySound(SuccesSound);
        }
      }
      if(OrderType() == OP_SELL && OrderMagicNumber()==Magic && OrderStopLoss() != SelSL*Point
      && SelSL*Point < OrderStopLoss())// && SelSL*Point < OrderOpenPrice())
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),SelSL*Point,OrderTakeProfit(),0,CLR_NONE);
        if(UseSound == true)
        {
        PlaySound(SuccesSound);
        }
      }
    }
  }
}

 
PapaYozh:


Если тики идут, пиктограмма советника "улыбается", советник должен совершать сделки (т.е. условия для этого возникают), но он их не совершает то надо отлаживать.

Расставьте по коду советника комаду Prinе(), особенно в тех местах, где производится сравнение и посмотрите что именно у Вас сравнивается. Возможно у Вас есть сравнение на равенствво переменных с типом double, и результат сравнения всегда ложь, в то время как Вы предполагаете, что переменные равны.

Спасибо огромное за советы!!! Разобрался со своим вопросом. Оказалось, что у нужного мне брокера при выставлении рыночного ордера, т.е. по условиям, нет возможности выставить одновременно стоп-уровни. Теперь выставляются ордера без стоп-уровней, а стоп-уровни я задаю выставить сразу после каждого ордера. Возникла проблема: модифицируется самая маленькая часть ордеров, а по большинству выдается в разделе "эксперты" следующее:

2011.05.19 09:46:55 Spacenewcomer-Svecha CLM1,M15: open #30906670 sell 0.01 CLM1 at 99.79 ok
2011.05.19 09:46:55 Spacenewcomer-Svecha CLM1,M15: invalid ticket for OrderModify function
2011.05.19 09:55:40 Spacenewcomer-Svecha ESM1,M5: open #30906787 buy 0.01 ESM1 at 1337.50 ok

2011.05.19 10:00:03 Spacenewcomer-Svecha EURUSD,M15: invalid ticket for OrderModify function

Привожу текст кода:

{
res=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"основной",_MagicNumber,0,Red);


OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopLoss*Point,Ask-TakeProfit*Point,0,Red);
return(0);

}

И при чем модифицируются именно те, которые открываются первыми после запуска советника!

Естественно, что в коде неправильно задана мной модификация ордеров... Подскажите!

 
так кто нибудь может помочь с функцией которая показывает два последних экстремума по ZZ ???
 
Уважаемые программисты, обращаюсь за посдсказкой по доработке советника: есть открытая позиция, через некоторое время поступает повторный сигнал на открытие в том же направлении. Я хочу, чтобы доливка по повторному сигналу происходила только в том случае если первый ордер уже находится в плюсе. Я сейчас реализовал это путем сравнения размера баланса и эквити (если эквити больше баланса, значит открытый ордер в плюсе), но такой вариант не подойдет, если на одном счете работают несколько советников.
Подскажите код для определения прибыли/убытка по имеющемуся открытому последнему ордеру .
 
Меряйте пипсами, самое надежное.
 
Roger:
Меряйте пипсами, самое надежное.
Можете код подсказать?