[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 180

 
solnce600:

Всем доброго времени суток!

Я новичок. Первый разы пытаюсь воплотить идею в код в тестере.

Идея простая - по цене открытия  каждой часовой  свечки открывать по одному  ордеру попеременно вверх и вниз.

Написал простой код .... но проблема в том,что на открытии одной свечи программа почему то  иногда  открывает  более  1 ордера.

Как мне кажется это происходит когда в течении 1 секунды приходят более 1 тика.

Как вариант пробовал в заголовок условия if( ) ставить..

OrdersTotal()==0

действительно открывается только один ордер.



 Но такой вариант мне не подходит так как на следующий день данная свеча не открывается,поскольку на момент открытия этой свечи

в торговле уже присутствуют разное  случайное количество ордеров.

Пробывал так же после строки     OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP); прерывать исполнение start()  при помощи return;   .... не помогло.


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

int start()   

  {
    double Price=Ask;   
    double SL=Price-300*Point;   
    double TP=Price+300*Point;
      if( Hour()==10 && Minute()== 00 && Seconds()==00)   
    OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
   }

Попробуйте этот вариант:
int TimeNow, TimePrev, PrevType;

int start()   
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,0,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
 }
 
alsu:


Большое спасибо за оперативный ответ.Я доволен.
 
Diubakin:
Попробуйте этот вариант:
Большое спасибо за оперативный ответ.Я очень  доволен.
 
Ув. профи! Где найти функцию СloseBy(), которая работает в ручном режиме? Хочу вставить в мой сов, чтобы можно было не вручную, а автоматически согласно условиям закрывать позицию с максимальным минусом противоположной с максимальным плюсом. В кодебэйс не нашёл. Спасибо!
 
borilunad:
Ув. профи! Где найти функцию СloseBy(), которая работает в ручном режиме? Хочу вставить в мой сов, чтобы можно было не вручную, а автоматически согласно условиям закрывать позицию с максимальным минусом противоположной с максимальным плюсом. В кодебэйс не нашёл. Спасибо!

 Попробуйте такой вариант:

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }
 

Сергей, на беглый взгляд стоящее! Прикручу, сделаю условия и попробую. Спасибо большое! 

Попробовал, работает без ошибок! Теперь только поэкспериментировать с условиями, чтоб толк был, и будет порядок! Но это уже завтра!

Большущее спасибо! И интересных сновидений!

 
borilunad:
Сергей, на беглый взгляд стоящее! Прикручу, сделаю условия и попробую. Спасибо большое! 
Только вместо команды на встречное закрытие вставьте полноценную функцию встречного закрытия - иначе это только для тестера. И переменные инициализируйте в функции.
 
artmedia70:
Только вместо команды на встречное закрытие вставьте полноценную функцию встречного закрытия - иначе это только для тестера. И переменные инициализируйте в функции.
Спасибо, Артём! Было уже поздно. Сегодня всё сделаю по правилам для онлайн!
 
borilunad:
Спасибо, Артём! Было уже поздно. Сегодня всё сделаю по правилам для онлайн!
Удачи...
 

Добрый день. Есть такой вопрос.

Переделал индикатор под себя с большим трудом из кусков кода других экспертов и индюков. Код не большой, все делает как я хочу.

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

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

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

Приведу кусок кода чтобы было понятней, это инициализация в индикаторе

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

Заранее спасибо всем