СТРАТЕГИЯ ИШИМОКУ

 

Я пытаюсь создать советник, который будет автоматически покупать 1 единицу, когда tenkan-sen>kijun-sen (когда линия tenkan-sen выше линии kijun-sen), а затем продавать ее, когда tenkan-sen ниже kijun-sen.

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

Ниже приведен результат, и я понимаю, что это, вероятно, полная чушь.

При попытке компиляции я получаю классическое "'(' - function definition unexpected" на строках int start() (скопированных из скрипта "trade" в навигаторе).

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


#property copyright "#copyright#"
#property link "#link#"

extern double Lots = 0.1;
extern double Tenkan = 9;
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int init()
{
Bars<=Tenkan, Bars<=Kijun;
//----
if(Bars<=Tenkan>Bars<=Kijun)
{
Print ("Тенкан-сен больше Киджун-сен");
return(0);
}
//----
//+------------------------------------------------------------------+
//| скрипт "торговля на все деньги"|
//+------------------------------------------------------------------+
int start()
{
//----
if(MessageBox("Вы действительно хотите купить 1.00 "+Symbol()+" по цене ASK? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0, "комментарий эксперта",255,0,CLR_NONE);
if(ticket<1)
{
int error=GetLastError();
Print("Ошибка = ",ErrorDescription(error));
return;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| функция деинициализации эксперта | |
//+------------------------------------------------------------------+
int deinit()
{
Bars<=Tenkan, Bars<=Kijun;
//----
if(Bars<=Tenkan<Bars<=Kijun)
{
Print ("Тенкан-сен меньше Киджун-сен");
return(0);
}
//----
int start()
{
//----
if(MessageBox("Вы действительно хотите ПРОДАТЬ 1.00 "+Symbol()+" по цене Bid? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0, "комментарий эксперта",255,0,CLR_NONE);
if(ticket<1)
{
int error=GetLastError();
Print("Ошибка = ",ErrorDescription(error));
return;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

 

Просмотрите примерный код MACD.

Измените переменные, получаемые для внутреннего индикатора Use By MACD, чтобы получить значения индикатора Ichmoku.

Сделайте небольшие изменения, а затем проверьте код на правильность синтаксиса.

редактировать - Также полезно посмотреть, как использовать индикатор Ichmoku здесь

 

Привет, ТоБа,

Три вещи;

Должно быть только 1 x init, 1 x deinit + 1 x start.

Функция start является основным телом вашего скрипта, который обрабатывает движение рынка (или тики).

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

 
Ickyrus:

Просмотрите примерный код MACD.

Измените переменные, получаемые для внутреннего индикатора Use By MACD, чтобы получить значения индикатора Ichmoku.

Сделайте небольшие изменения, а затем проверьте код на правильность синтаксиса.

редактировать - Также полезно посмотреть, как использовать индикатор Ichmoku здесь


Хорошо, я переделал его, основываясь на примере MACD, но с этими ошибками:

'\end_of_program' - ending bracket '}' expected C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

'\end_of_program' - несбалансированная левая скобка C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)


Это новая версия:

//+------------------------------------------------------------------+
//| ICHIMOKU.mq4 |
//| Copyright © 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double Tenkan = 9;
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| функция инициализации эксперта |
//+------------------------------------------------------------------+
int start()
{
double tenkan_sen;
double kijun_sen;
int cnt, ticket, total;
//----
if(Bars<100)
{
Print("баров меньше 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit меньше 10");
return(0); // проверяем TakeProfit
}
//----
total=OrdersTotal();
if(total<1)
{
// открытых ордеров не выявлено
if(AccountFreeMargin()<(1000*Lots))
{
Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());
return(0);
}
// проверка возможности длинной позиции (BUY)
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else Print("Ошибка при открытии ордера BUY : ",GetLastError());
return(0);

// важно правильно войти в рынок,
// но еще важнее правильно выйти из него...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // проверка наличия открытой позиции
OrderSymbol()==Symbol()) // проверка наличия символа
{
if(OrderType()==OP_BUY) // открыта длинная позиция
{
// должна ли она быть закрыта?
if((tenkan_sen<kijun_sen))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выход
}
// проверка наличия трейлинг-стопа
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
}
}
return(0);
}


 

В этот момент в "вашем" кодексе . . .

}
else Print("Error opening BUY order : ",GetLastError()); 
return(0); 

                       //   <------  here  ! ! ! 

// it is important to enter the market correctly, 
// but it is more important to exit it correctly... 
for(cnt=0;cnt<total;cnt++)
{

... отмечено здесь ! ! ! Вы перешли от размещения ордеров к их закрытию ... но вы пропустили, возможно, 2 закрывающие ( } ) скобки из части кода покупки ... если вы отступаете код разумным образом, это легко увидеть.

 

Хорошо, спасибо. Я сделал это изменение, которое удалило '\end_of_program' - завершающая скобка '}' ожидается C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

Он помечен <=======

// проверка возможности длинной позиции (BUY)
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green);
if(ticket>0)
} <=======
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(" Открытордер BUY: ",OrderOpenPrice());
}
else Print("Ошибка при открытии ордера BUY : ",GetLastError());
return(0);
}
// важно правильно войти в рынок,

// но еще важнее правильно выйти из него...


Хотя кажется, что этого не должно быть.

 

У вас есть излишек открывающегося кронштейна на этой линии...

if  ( (  tenkan_sen<kijun_sen )   // <--  surplus  (
 
Пожалуйста, используйте это для размещения кода . . так легче читать.

 

Вы инициализируете эти переменные, но не даете им никаких значений. . .

if (  tenkan_sen  > kijun_sen  )

... поэтому тест всегда будет ложным. Этот советник никогда не разместит ордер.

 

Ваш код в версии с отступами и который компилируется . . .

//+------------------------------------------------------------------+
//| ICHIMOKU.mq4                                                     |
//| Copyright © 2012, MetaQuotes Software Corp.                      |
//| http://www.metaquotes.net                                        |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double Tenkan = 9;
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
   double tenkan_sen;
   double kijun_sen;
   int cnt, ticket, total;
   //----
   if(Bars<100)
      {
      Print("bars less than 100");
      return(0); 
      }
   
   if(TakeProfit<10)
      {
      Print("TakeProfit less than 10");
      return(0); // check TakeProfit
      }

   //----
   total=OrdersTotal();
   if(total<1) 
      {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
         {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0); 
         }
      // check for long position (BUY) possibility
      if(tenkan_sen>kijun_sen)
         {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"ichimoku",16384,0,Green);
         if(ticket>0)
            {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
         
         }   //  added by RaptorUK
      }   //  added by RaptorUK
            
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly... 
   for(cnt=0;cnt<total;cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && // check for opened position 
         OrderSymbol()==Symbol()) // check for symbol
         {
         if(OrderType()==OP_BUY) // long position is opened
            {
            // should it be closed?
            if(tenkan_sen<kijun_sen)   //  removed surplus (  RaptorUK
               {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
               return(0); // exit
               }
                  
            // check for trailing stop
            if(TrailingStop>0) 
               { 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                  {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                     {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                     }
                  }
               }
            }
         }
      }
   return(0);
   }
 
Большое спасибо :)