Сложно ли написать эксперта без ошибок? - страница 2

 
так, а что не то?
 
crazytrain >>:

Завязывайте флудить, че всем влом что ли глянуть? выложил прибыльную стратегию - а народу ваще все равно....

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

если система ценна то нужно расчитывать только на собственные силы

ЗЫ куски куда поправить всегда пожалуста найдеца много алтруистов

 

Куски кода, сложно выкладывать, потому что вроде с виду все работает... Но вот там есть кусок кода который выводит ошибку с параметрами в отдельный файл.

Написал коды ошибок, сначала "146" потом "6", хотя вроде все написано правильно. В итоге пропустил выход из рынка. Может косяк в коде - может дело в ДЦ... не знаю. А может где-то есть еще ошибки - но они пока не видны в явном виде, но при реальной торговле окажутся существенными...

Поэтому и прошу посмотреть весь код.

 
sol >>:

Не переборщите с йодом.

И изотопы лучше не принимать :))

 

Веселый топик получился :)

Код и вправду влом глядеть всем, я глянул - там многа строчек :)

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

void OpenOrder(int Cmd) {

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

if (Wait > TimeCurrent() || !IsTradeAllowed() || IsTradeContextBusy()) return;

RefreshRates();

// берем самые свежия значения цены

if (Cmd == OP_BUY) OpenPrice = Ask;
else OpenPrice = Bid;

if (!OrderSend(Symbol(), Cmd, Lots, OpenPrice, slippage, StopLoss, TakeProfit)) {
check = GetLastError();

switch (check) {
case ERR_NO_ERROR:
Print("How cat it be?");
return;
case ERR_COMMON_ERROR:

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

case ERR_LONG_POSITIONS_ONLY_ALLOWED:
Wait = 1440; // Задем размер паузы

break;

case ERR_SERVER_BUSY:
Wait = 180; // Пауза по-короче...

break;
case ERR_TRADE_TIMEOUT:
Wait = 120; // Еще короче

break;

case ERR_NO_CONNECTION:

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


default:
Wait = 5
}

Wait += TimeCurrent();

Print("Error!");

return();

}

Wait = 0;

return();


}


Код предполагает, что сигнал устойчивый и после определенной паузы, заданной в переменной Wait попытка открыть ордер повториться.

 
bvn >>:

Код предполагает, что сигнал устойчивый и после определенной паузы, заданной в переменной Wait попытка открыть ордер повториться.

Немного не понял, где в вашем коде он повторится? Либо выйдет по брейку, либо просто выйдет по return(), или саму эту функцию предлагается засунуть в цикл для повтора?


Да и я еще не видел ни одного торгующего советника с малым кол-ом строк, либо его в связи с отсутсвием форматирования читать невозможно.

 
crazytrain >>:

Немного не понял, где в вашем коде он повторится? Либо выйдет по брейку, либо просто выйдет по return(), или саму эту функцию предлагается засунуть в цикл для повтора?


Да и я еще не видел ни одного торгующего советника с малым кол-ом строк, либо его в связи с отсутсвием форматирования читать невозможно.

Это каркас функции, которую вы можете засунуть в цикл или куда вам заблогарссудится... Я обычно использую такую функцию один раз в каждом следующем тике, если вычисляется устойчивый сигнал открыть ордер, то попытка повторяется, но только, если прошло определенное время с момента последней неудачной попытки... Короче, если мой код вам без пользы, забейте... правда, лень разбираться в чужом коде, число строк которого превышает 10-20

 
bvn >>:

Это каркас функции, которую вы можете засунуть в цикл или куда вам заблогарссудится... Я обычно использую такую функцию один раз в каждом следующем тике, если вычисляется устойчивый сигнал открыть ордер, то попытка повторяется, но только, если прошло определенное время с момента последней неудачной попытки... Короче, если мой код вам без пользы, забейте... правда, лень разбираться в чужом коде, число строк которого превышает 10-20

Я вас понял, код мне пригодился. Давайте я сокращу свой вопросы до 10-20 строк кода?

int start()
{
// проверяем пришел ли новый бар на графике, если да то выполняем эти действия - иначе нет
if (isNewBar())
{
   if (bUpOrders)
      {
      MAValueDN = iMA(Symbol(),PERIOD_M15,iMAperiod,iMAshift,iMAmode,iMApricetypeDN,1);
      if(MAValueDN>=Close[1])
         {
         OpenBuyPosition();
         }//if(MAValueUP>Close(1))
      }//if (bUpOrders)
   if (bDnOrders)
      {
      MAValueUP = iMA(Symbol(),PERIOD_M15,iMAperiod,iMAshift,iMAmode,iMApricetypeUP,1);
      if(MAValueUP<=Close[1])
         {
         OpenSellPosition();
         }//if(MAValueUP>Close(1))
      }//if (bDnOrders)
} //if (isNewBar())     
   return(0);
}


При такой проверке нового бара isNewBar(), она сработает только на первом тике нового бара? И по сути если при этом возникнет ошибка постанвки позиции, то на втором тике мы уже сюда не попадем? Я правильно понимаю? Как этого избежать? Ну чтобы проверка работала не только на первом тике, но и на следующих 2 ?


bool isNewBar()
{
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
   return(res);   
}  
 
crazytrain >>:

При такой проверке нового бара isNewBar(), она сработает только на первом тике нового бара? И по сути если при этом возникнет ошибка постанвки позиции, то на втором тике мы уже сюда не попадем? Я правильно понимаю? Как этого избежать? Ну чтобы проверка работала не только на первом тике, но и на следующих 2 ?

int expertBars[3];

void init()
{
   ArrayInitialize(expertBars, EMPTY_VALUE);
}

bool isNewBar()
{
   for (int i = 0; i < 3; i++)   
   {
      if (expertBars[i] != Bars) 
      {
         expertBars[i] = Bars;
         return (true);
      } 
   }

   return(false);
}  
НО, все это очень относительно.
 

стоит немного упростить..

1. убрать isNewBar(), OpenBuyPosition(), OpenSellPosition(), CheckLastPosition()..

2. добавить isOpenedOrder()

3. заменить start()

int isOpenedOrder(){   
   int k = OrdersTotal();  
   for (int i = 0; i < k; i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {          
         if (OrderSymbol()==Symbol()) return(OrderType());
      }
   }
   return(-1);
}  

int start(){
   double MAValueUP;
   double MAValueDN;
   double dMAHigh;
   
   Print("Началься долбаный старт.",Symbol());
   ErrorFileName="Error " + Day()+ " " + Month() + " " + Year()+".csv";
   
   //проверяем разрешили мы при запуске эксперта проводит покупки ?
   if (bUpOrders) {
      // вычисляем данные для проверки      
      MAValueDN = iMA(Symbol(),PERIOD_M15,iMAperiod,iMAshift,iMAmode,iMApricetypeDN,1);
      //проверяем выполняется ли условие на покупку?
      //если да - то открываем позицию BUY
      Print("И снова облом! Мувинг на пред баре = ",MAValueUP," ; закрытие предыдущего бара =",Close[1]);
      
      if(MAValueDN>=Close[1]) {
         if (isOpenedOrder()==OP_BUY) return(0);
         else
            if (isOpenedOrder()==OP_SELL) {
               if (ClosePosition("selling")) CreatePosition("buying");
            }else CreatePosition("buying");           
      }      
   }
   //проверяем разрешили мы при запуске эксперта проводит продажи ?
   if (bDnOrders) {
      // вычисляем данные для проверки      
      MAValueUP = iMA(Symbol(),PERIOD_M15,iMAperiod,iMAshift,iMAmode,iMApricetypeUP,1);
      //проверяем выполняется ли условие на продажу?
      //если да - то открываем позицию SELL   
      Print("Мувинг на пред баре = ",MAValueUP," ; закрытие предыдущего бара =",Close[1]);
      
      if(MAValueUP<=Close[1]){
         if (isOpenedOrder()==OP_SELL) return(0);
         else
            if (isOpenedOrder()==OP_BUY) {
               if (ClosePosition("buying")) CreatePosition("selling");
            }else CreatePosition("selling");
      }
   }   
//----
   return(0);
}
Причина обращения: