Помогите чайнику, разобраться с советником. - страница 2

 
Figar0 >>:

Сказать есть чего, но как-то не особенно хочется) Одну ошибку я вижу, а именно отсутствие фигурных скобок после объявления цикла, а может это и не ошибка, при некоторых условиях может и работать, причин может быть несколько... Фрагмент кода не является законченым, это как принести колесо и спросить почему машина не едет, да и для вставки кода есть пипка SRC. А лучше выложить законченую демонстрацию неработоспособности.

может кто-то поможет исправить код, эксперты по mql где вы?, сам не могу разобраться в чем ошибка

 
zan >>:
нечего сказать?

Очень правокационно вы пишете zan, а ведь помощи просите.

zan >>:

может кто-то поможет исправить код, эксперты по mql где вы?, сам не могу разобраться в чем ошибка

Не знаю как на счёт экспертов MQL4, а как новичёк новичку помочь готов, если вы сами согласны на подобную помощь.


Что бы проще было помочь, разделите комментариями функции советника: Торговые условия, трейлинг стоп и т.д.

Хотя бы ту версию, которую вы изначально выложили.

 

У меня такой вопрос. Написал небольшой советник и прогнал его на тесте, однако оказалось - слишком много левых сделок совершил МТС. И тогда начал его упрощать, что бы узреть суть проблемы. Дошёл до того, что осталось всего одно условие на открытие всего одного ордера. Казалось бы, чего может быть проще, запускаешь и смотришь на свой единственный ордер на всей истории, радуешься. Но как показывает практика ордеров оказалась не одна сотня. :( И вообще задействован не вся история, а только непонятная часть из середины. Вопрос: Почему?

Как-то слышал где-то на форумах, что такой глюк возможен из-за неочищенного кеша или типа того. Т.е. МТ4 как бы не подчищает за собой хвосты и потом при последующих тестах ориентируется на собственный неподтёртый мусор. Так ли это? И как с этим бороться?

Тут, наверное, нужно уточнить, что писать МТС я начал недавно и предыдущие релизы как-то таких проблем не вызывали. Возможно, из-за обесточивания компьютера во время работы произошёл данный глюк, т.к. не была корректно завершена работа программы. ХЕЗ? :)

 
Novice >>:

Очень правокационно вы пишете zan, а ведь помощи просите.

Не знаю как на счёт экспертов MQL4, а как новичёк новичку помочь готов, если вы сами согласны на подобную помощь.


Что бы проще было помочь, разделите комментариями функции советника: Торговые условия, трейлинг стоп и т.д.

Хотя бы ту версию, которую вы изначально выложили.

Вот описание

1. Совершаем покупку/продажу по сигналам MACD&Stochastic. Сигнал макди взят из советника MACD SAMPLE который идет с метатрейдер4,в этом же советнике МА заменен на стохастик, т.е. сигналом служит персечение макди ( основной с сигнальной линией) и также и в стохастике.--основной ордер

2. если мы находимся в плюсе и после того как советник совершил сделку,

if(total>0 && total<MaxLots)
{
for(cnt=0;cnt<total;cnt++)
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
cenaoppos=OrderOpenPrice();//цена открытия
lot=OrderLots();//ордер
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) //позиция на покупку
{
Cena=Ask;//цена
if((cenaoppos+pips*Point)<Cena)//если цена открытия +пипс()*пунктам меньше цены, то
{
OrderSend(Symbol(),OP_BUY,lot,Ask,3,Bid-sl,Ask+TakeProfit*Point,0,Green);//покупаем еще один лот
return(0);
}
}
else
{
Cena=Bid;//цена
if((cenaoppos-pips*Point)>Cena)//если цена открытия-пипс *пунктам больше цены, то//----

{
OrderSend(Symbol(),OP_SELL,lot,Bid,3,Ask+sl,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //продаем еще один лот
return(0);
}
}
}
}

этот код должен совершать доливку,т.е. совершаем еще сделку(такую же сделку продажа /покупка) в добавок к той которая у нас была.

но открывает добавочный ордер после выполнения этого условия:

if((cenaoppos+pips*Point)<Cena) -при покупке

if((cenaoppos-pips*Point)>Cena)- при продаже

3. следующая функция ORDERMODIFY должен модифицировать все совершенные сделки : основную и добавочная, пр выполнения этих условий:

if(Bid-OrderOpenPrice()>Point*TrailingStop)//если цена-цена открытия больше траилинга в пунктах
{
if(OrderStopLoss()<Bid-Point*TrailingStop)//если стоплосс меньше цена-траилинг в пунктах( цены открытия)

_____________________________________________________________________________________________________________________%%

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))//если цена открытия-цена больше траилинга в пунктах
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))//если стоплосс больше цена+траилинг в пунктах(цены открытия)
{



функция ORDERMODIFY работает правильно, не работает только функция добавочного ордера.

Заранее благодарен тем кто откликнулся.

 
reset >>:

У меня такой вопрос. Написал небольшой советник и прогнал его на тесте, однако оказалось - слишком много левых сделок совершил МТС. И тогда начал его упрощать, что бы узреть суть проблемы. Дошёл до того, что осталось всего одно условие на открытие всего одного ордера. Казалось бы, чего может быть проще, запускаешь и смотришь на свой единственный ордер на всей истории, радуешься. Но как показывает практика ордеров оказалась не одна сотня. :( И вообще задействован не вся история, а только непонятная часть из середины. Вопрос: Почему?

Как-то слышал где-то на форумах, что такой глюк возможен из-за неочищенного кеша или типа того. Т.е. МТ4 как бы не подчищает за собой хвосты и потом при последующих тестах ориентируется на собственный неподтёртый мусор. Так ли это? И как с этим бороться?

Тут, наверное, нужно уточнить, что писать МТС я начал недавно и предыдущие релизы как-то таких проблем не вызывали. Возможно, из-за обесточивания компьютера во время работы произошёл данный глюк, т.к. не была корректно завершена работа программы. ХЕЗ? :)

чем смогу тем помогу, выкладывай.

 
zan >>:

Вот описание

......

функция ORDERMODIFY работает правильно, не работает только функция добавочного ордера.

Заранее благодарен тем кто откликнулся.

А где, собственно, функции ? Какие параметры, как вызываются ? Что пишет в предупреждениях компилятор ? Потом, в приведенном куске кода Вы  работаете только с одним ордером с номером (total-1)- это верно, то есть так и задумано ? (Думаю, что нет).

Вам же посоветовали - если хотите помощи :

1. желательно весь неработающий код - здесь телепатов нет и дописывать за Вас логику врядли кто будет.

2. Для представления кодов программ есть тэг SRC - воспользуйтесь. Фоматировать за Вас текст для понимания логики и возможных ошибок реализации тож удовольствие сомнительное.

Успехов.

 
0 ошибок, 0 предупреждений
//+------------------------------------------------------------------+
//|                                                     проверка.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double Lots=0.1;
extern double TakeProfit=50;
extern double TrailingStop=20;
extern double MaxLots=7;
extern double pips=7;
extern double per_K=15;
extern double per_D=3;
extern double slow=3;
extern double zoneBUY=50;
extern double zoneSELL=70;
extern double MACDOpenLevel=3;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  double total,Cena,cnt,lot;
  double cenaoppos,l,sl;
  double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious;
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
  total=OrdersTotal();
    if(total<1)
    {  
    if(iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,0,1)>iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,1,1)
      && iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,1,1)<zoneBUY)//стохастик растет и
      if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&//сигнальная MACD пересекает основную MACD сверху вниз
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point))
      {
        sl=MaxLots*TrailingStop*Point+20*Point;//вычисляем стоплосс
         OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-sl,Ask+TakeProfit*Point,0,Green); //покупаем
         }
     if(iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,0,1)<iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,1,1)
      && iCustom(NULL,0,"StochasticML",per_K,per_D,slow,MODE_LWMA,1,1,1)>zoneSELL)//стохастик падает и
       if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && //сигнальная MACD пересекает основную MACD снизу ввверх
         MacdCurrent>(MACDOpenLevel*Point))
      {
         sl=MaxLots*TrailingStop*Point+20*Point;//вычисляем стоплосс
         OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl,Bid-TakeProfit*Point,0,Red);//продаем
         }      
      }
 
 

вот продолжение кода

    if(total>0 && total<MaxLots)      
      {
      for(cnt=0;cnt<total;cnt++)
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      cenaoppos=OrderOpenPrice();//цена открытия
      lot=OrderLots();//ордер
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   //позиция на покупку
           {
           Cena=Ask;//цена 
            if((cenaoppos+pips*Point)<Cena)//если цена открытия +пипс()*пунктам меньше цены, то 
                {
                OrderSend(Symbol(),OP_BUY,lot,Ask,3,Bid-sl,Ask+TakeProfit*Point,0,Green);//покупаем еще один лот 
                 return(0); 
                }
           }
         else 
           {
           Cena=Bid;//цена 
            if((cenaoppos-pips*Point)>Cena)//если цена открытия-пипс *пунктам больше цены, то//----
                                                                                        
              {
              OrderSend(Symbol(),OP_SELL,lot,Bid,3,Ask+sl,Bid-TakeProfit*Point,"macd sample",16384,0,Red);    //продаем еще один лот         
               return(0); 
              }
           }
        }
      }
      for(cnt=0;cnt<total;cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()==OP_BUY)
        {  
         if(TrailingStop>0)  
           {                 
            if(Bid-OrderOpenPrice()>Point*TrailingStop)//если цена-цена открытия больше траилинга в пунктах
              {
               if(OrderStopLoss()<Bid-Point*TrailingStop)//если стоплосс меньше цена-траилинг в пунктах( цены открытия)
                 {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,Ask+TakeProfit*Point,0,Green);
                  return(0);//изменяем стоп
                 }
              }
           }
         }
         
       else
            {
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))//если цена открытия-цена больше траилинга в пунктах
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))//если  стоплосс больше цена+траилинг в пунктах(цены открытия)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,Bid-TakeProfit*Point,0,Red);//изменяем  
                     return(0);
                    }
                 }
              }
           }
           
//----------------------------------
}}
 
мне кажется ошибка в этом коде
if(total>0 && total<MaxLots)      
      {
      for(cnt=0;cnt<total;cnt++)
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      cenaoppos=OrderOpenPrice();//цена открытия
      lot=OrderLots();//ордер
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY) 
 
zan >>:
мне кажется ошибка в этом коде
for(cnt=0; cnt < total;cnt++)
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

Вот здесь Вы работаете только с одним ордером

Все это :

  cenaoppos=OrderOpenPrice();//цена открытия
      lot=OrderLots();//ордер
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY) 
будет выполняться только для ордера с номером 
cnt = total-1
Поскольку, отработав цикл

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

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

Это так задумано или пропущена открывающая скобка после 


for(cnt=0; cnt < total;cnt++)

?


И, к стати, в блоке трала


for(cnt=0;cnt<total;cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()==OP_BUY)
        {  
         if(TrailingStop>0)  
           {                 
            if(Bid-OrderOpenPrice()>Point*TrailingStop)//если цена-цена открытия больше траилинга в пунктах
              {
               if(OrderStopLoss()<Bid-Point*TrailingStop)//если стоплосс меньше цена-траилинг в пунктах( цены открытия)
                 {
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,Ask+TakeProfit*Point,0,Green);
                  return(0);//изменяем стоп
                 }
              }
           }
         }
         
       else
            {
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))//если цена открытия-цена больше траилинга в пунктах
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))//если  стоплосс больше цена+траилинг в пунктах(цены открытия)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,Bid-TakeProfit*Point,0,Red);//изменяем  
                     return(0);
                    }
                 }
              }
           }

вставьте проверку "символа"


OrderSymbol()==Symbol()

, а то рискуете "влепить" стоп от фунта в евру или наоборот.

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