Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 155

 

народ, посмотрите пожалуйста код, что в нём не так?? первый мой советник.. должен работать по такой стратегии: сначала открывается ордер (не важно в какую сторону, то есть рандомно) и выставляется отложенный ордер в противоположную сторону с удвоенным объёмом, например, если выставился buy, то выставляется sellstop на 25 пунктов ниже чем buy, а если выставился sell, то выставляется buystop на 25 пунктов выше. Если срабатывает один из отложенных ордеров, то выставляем ещё один отложенный ордер в противоположную сторону от сработанного ордера, по цене первого открытого ордера. если и он срабатывает, то опять выставляем отложенный в противоположную сторону от сработавшего на расстоянии 25 пунктов, и т.д. Таким образом все ордера buy должны быть с одной ценой, и все sell тоже с одной ценой. Если кто-нибудь понял что я тут написал, то помогите с кодом))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
А это из индикатора или из советника? Есть разница. В общих чертах, чтобы не рисовать стрелку, то в индикаторе нужно проверить соседний предыдущий бар и, если он имеет не нулевое и не пустое значение, значит - стрелка на соседнем баре уже есть и в буфер текущего бара значение вносить не нужно. Для советника также, если на соседнем предыдущем баре есть уже зафиксированный факт пересечения в ту же сторону, что и на текущем, и стрелочкой этот факт уже отмечен, то на текущем баре факт пересечения можно не регистрировать (если он тоже есть) и стрелку выводить тоже не обязательно.
Больше ничего по вашему коду я подсказать не могу. Если есть поблизости телепаты, они наверное смогут в большей степени вникнуть в предоставленный вами код ;)

Это из индикатора. Пересечение 2 скользящих, выдает направление. Не совсем понял, направление дает только при пересечении не на каждом баре. От сюда, судить по предыдущему бару нельзя.... Скажите, мы ведь собираем массив? Как проверить предыдущую ячейку? Два буфера один CrossUp[i]=Low[i] - Range*0.75;, другой скажем Cr[i]=Low[i] + Range*0.75;(просто не охота лезть в новь по папкам и в код)
 
zaqwsx123:

народ, посмотрите пожалуйста код, что в нём не так?? первый мой советник.. должен работать по такой стратегии: сначала открывается ордер (не важно в какую сторону, то есть рандомно) и выставляется отложенный ордер в противоположную сторону с удвоенным объёмом, например, если выставился buy, то выставляется sellstop на 25 пунктов ниже чем buy, а если выставился sell, то выставляется buystop на 25 пунктов выше. Если срабатывает один из отложенных ордеров, то выставляем ещё один отложенный ордер в противоположную сторону от сработанного ордера, по цене первого открытого ордера. если и он срабатывает, то опять выставляем отложенный в противоположную сторону от сработавшего на расстоянии 25 пунктов, и т.д. Таким образом все ордера buy должны быть с одной ценой, и все sell тоже с одной ценой. Если кто-нибудь понял что я тут написал, то помогите с кодом))

Ерунду вы понаписали... Хотя бы это:

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

вы уверены, что ордер выбран? Вы уверены, что это цена? Вы уверены, что у ордера тикет == 1 ? При выборе по тикету pool не имеет значения, поэтому MODE_TRADES там лишнее. После успешного выбора по тикету нужно ещё проверить время закрытия выбранного ордера. Если оно == 0, то ордер находится в рынке и выбран из списка рыночных ордеров, если время закрытия > 0, то ордер закрыт, либо является удалённым отложенным и выбран из списка закрытых ордеров.

Дальше в код смотреть не охота... Наверное, вам прежде нужно с азами ознакомиться. Читайте учебник и документацию - они тут на видном месте.

 
artmedia70:


Дальше в код смотреть не охота...


то что бросилось в глаза)) Зачем 4 одинаковых цыкла? и выборка не то что в коменте

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

с селстопом аналогично. надо OP_BUYSTOP и OP_SELLSTOP

 
ALXIMIKS:


то что бросилось в глаза)) Зачем 4 одинаковых цыкла? и выборка не то что в коменте

с селстопом аналогично. надо OP_BUYSTOP и OP_SELLSTOP

Я не дошёл до этого. Когда смотришь в код и видишь, что объяснять придётся не ошибки, а начинать просто обучение человека с азов, которые он и сам мог прочесть, то ... нет охоты и желания. Учёбу можно провести на платной основе, но не там, где просто помогаешь найти ошибки в коде, а не код среди ошибок.
 
Zolotai:

Это из индикатора. Пересечение 2 скользящих, выдает направление. Не совсем понял, направление дает только при пересечении не на каждом баре. От сюда, судить по предыдущему бару нельзя.... Скажите, мы ведь собираем массив? Как проверить предыдущую ячейку? Два буфера один CrossUp[i]=Low[i] - Range*0.75;, другой скажем Cr[i]=Low[i] + Range*0.75;(просто не охота лезть в новь по папкам и в код)
Нет никаких исходных данных. Попробуйте здесь поискать.
 
Есть ордер BUY_STOP который был удален до исполнения:




Код проверки:
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

Строка с результатом:
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4" это же OP_SELLLIMIT?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - Откуда появилось значение OrderClosePrice(), не равное OrderOpenPrice()?

 
chief2000:

Есть ордер BUY_STOP который был удален до исполнения:




Код проверки:

Строка с результатом:

1, OrderType=4 - "4" это же OP_SELLLIMIT?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - Откуда появилось значение OrderClosePrice(), не равное OrderOpenPrice()?

а вы в тестере в режиме визуализации, да по всем тикам, в пошаговом режиме (F12 на паузе) найдите момент его удаления и посмотрите текущую цену, может там собачка порылась?
 
artmedia70:
а вы в тестере в режиме визуализации, да по всем тикам, в пошаговом режиме (F12 на паузе) найдите момент его удаления и посмотрите текущую цену, может там собачка порылась?


БИНГО! Не знал, но все как Вы написали, т.е. цена закрытия в этом случае это значение цены в момент, когда ордер был удален. Спасибо!
 

Часто я внутри функций объявлял переменную типа так:

int err = GetLastError();

Дальше внутри, при каком-то условии уже вызываю её, чтобы увидеть, если есть ошибка. Ну это не только у меня, а и много где, в кодах, которые мне попадались. Так сказать, типичная ситуация. Сегодня я подумал, что не логично каждый раз, в каждой функции, где требуется контролировать ошибки, объявлять ту же самую переменную. Подумал, пришёл к выводу, что проще будет один раз объявить глобально и инициализировать её в ините. Как-то так:

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

А дальше, когда нужно в пользовательских функциях вызывать переменную err, зная, что у неё уже есть значение. По сути, GetLastError() выдаёт код последней ошибки, а значит, если в каждой функции будет вызываться в конце всех расчётов данная переменная err, отвечающая за вывод кода ошибки, и, вызывающая GetLastError(), то всё будет верно, так?

Но зато, если не вызвать по конце какой-то функции (по цепочке выполнения кода эксперта) то переменная не обнулится, и это грозит не верным выполнением, в случает, если в предыдущей по цепочке выполнения кода была ошибка, а в текущей нет, НО код ошибки то возвращается последний... а для её сброса, необходимо вызвать данную функцию GetLastError(). Т.е. тут всё зависит от того, вызвана оно была или нет. Если нет уверенности, что будет везде так, проще перестраховаться и обнулять её каждый раз, так?

Причина обращения: