Автор Тема: Вопросы от новичков...  (Прочитано 34806 раз)

0 Пользователей и 1 Гость просматривают эту тему.

20 Январь 2013, 18:44:09
Прочитано 34806 раз

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Любые вопросы по написанию советников и по возникшим проблемам !
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 01:53:43
Ответ #1

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
Владимир привет, вчера общались по моему вопросу как передать сигнал из индикатора в советник, ты мне кинул
UAA.mq4, вижу что там есть функция, а как это использовать?
я наверное погорячился вчера сказав что разбираюсь в mql, на верное только с учебником.

28 Январь 2013, 07:01:54
Ответ #2

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Здравствуйте !
Приложите код или скопируйте его в эту тему я расскажу.
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 07:50:45
Ответ #3

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
xpMA, это индюк. UAA это функцию ты здесь делал из индюка, Moy это советник я в принципе
добавил еще линию 7-ую в индюк ее в советнике получаю iCustom(Symbol(), 0,"xpMA",7,7,0)
но мне надо что не на каждом тике видеть сигнал, а чтобы когда сигнал появился  в индюке, передать его в советник чтобы тот открыл или закрыл ордер

28 Январь 2013, 08:01:26
Ответ #4

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
xpMA, это индюк. UAA это функцию ты здесь делал из индюка, Moy это советник я в принципе
добавил еще линию 7-ую в индюк ее в советнике получаю iCustom(Symbol(), 0,"xpMA",7,7,0)
но мне надо что не на каждом тике видеть сигнал, а чтобы когда сигнал появился  в индюке, передать его в советник чтобы тот открыл или закрыл ордер

Что то я не могу понять что за 7 линию вы добавили и куда ????
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 08:07:19
Ответ #5

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
в xpMA

SetIndexBuffer(7,sss);

вот здесь в индюке передается
if(UpBuffer[1] == EMPTY_VALUE &&  UpBuffer[0] != EMPTY_VALUE && Buffer3[1] != UpBuffer[0])
      AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Up Signal-"+DoubleToStr(Bid, 4),1);
      sss[0]=1;
   if(DownBuffer[1] == EMPTY_VALUE &&  DownBuffer[0] != EMPTY_VALUE && Buffer3[1] != DownBuffer[0])   
      AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Down Signal-"+DoubleToStr(Ask, 4),2);
      sss[0]=-1;

как передать это в советник сразу после появления сигнала?

28 Январь 2013, 08:13:19
Ответ #6

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
//+------------------------------------------------------------------+
//|                       XP Moving Average                          |
//|                                                          Moy.mq4 |
//|                                                                  |
//|                                          http://www.trading-go.ru|
//+------------------------------------------------------------------+
#define MODE_DEMA 4
#define MODE_TEMA 5
#define MODE_T3MA 6
#define MODE_JMA 7
extern string Sovetnic = "Settings";
extern int       period=10;
extern int       TakeProfit=50;
extern int       StopLoss=30;
extern int       Lots=1;
extern string Indikator = "Settings";
extern   int      MA_Period               = 24;
extern   int      MA_Type                 = MODE_TEMA;
extern   int      MA_Applied              = PRICE_CLOSE;
extern   double   T3MA_VolumeFactor       = 0.8;
extern   double   JMA_Phase               = 0;
extern   int      Step_Period             = 4;
extern   bool     DebugMode               = false;

bool     Alert_On                = true;
bool     Arrows_On               = true;
int      UpArrowCode             = 233;
int      DownArrowCode           = 234;
color    UpArrowColor            = Red;
color    DownArrowColor          = Blue;
int      UpArrowSize             = 3;
int      DownArrowSize           = 3;

double UpBuffer[];
double DownBuffer[];
double Buffer3[];
double buffer[];
double tempbuffer[];
double matriple[];
double signal[];

int expertBars=0;
double level=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
bool isNewBar()
  {
   bool res=false;
   if (expertBars!=Bars)
      {
      expertBars=Bars;
      res=true;
      }
   return(res);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  double price;
  double stop;
  double profit;
//----
   if ((isNewBar())&&  (OrdersTotal()==0) &&(AccountBalance()>10))// тут немного не правильно
   {
      level=iCustom(NULL, 0,"xpMA",7,7,0);
      Alert("level= ", level," такой");
      if (level>0)
      {
         //price=NormalizeDouble(Ask,Digits);
         //stop=NormalizeDouble(price-StopLoss*Point,Digits);
         //profit=NormalizeDouble(price+TakeProfit*Point,Digits);
         //OrderSend(Symbol(),OP_BUY,Lots,price,3,stop,profit,NULL,0,0,Green);
         //Print(AccountBalance());         
      }
      if (level<0)
      {
         //price=NormalizeDouble(Ask,Digits);
         //stop=NormalizeDouble(price+StopLoss*Point,Digits);
         //profit=NormalizeDouble(price-TakeProfit*Point,Digits);
         //OrderSend(Symbol(),OP_SELL,Lots,price,3,stop,profit,NULL,0,0,Green);
         ////Print(AccountBalance());           
      }     
     
      if ( xMA() == 1 )
      {
      //есть сигнал на покупку и он же сгнал для закрытия селл ордера
      }
      if ( xMA() == -1 )
      {
      //есть сигнал на продажу и он же сгнал для закрытия бай ордера
      }       
     
   }   
//----
   return(0);
  }
//==============================================================================================//
//  Функция индикатора и его полное тело
//==============================================================================================//
int xMA()
{
   int limit;
   int i = 0;
   
   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);
   //if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars-1;
   
   switch (MA_Type)
   {
      case 0:
      case 1:
      case 2:
      case 3:
            {
                  for(i=0; i<limit; i++)
                  {
                     buffer[i] = iMA(NULL,0,MA_Period,0,MA_Type,MA_Applied,i);
                  }
            }
            break;
     
      case 4:
            {
                  for(i=0; i<limit; i++)
                  {
                     tempbuffer[i] = iMA(NULL,0,MA_Period,0,MODE_EMA,MA_Applied,i);
                  }
                  for(i=0; i<limit; i++)
                  {
                     matriple[i] = iMAOnArray(tempbuffer,0,MA_Period,0,MODE_EMA,i);
                  }
                  for(i=0; i<limit; i++)
                  {
                     buffer[i] = iMAOnArray(matriple,0,MA_Period,0,MODE_EMA,i);
                  }
            }
            break;
     
      case 5:
            {
                  for(i=0; i<limit; i++)
                  {
                     tempbuffer[i] = iMA(NULL,0,MA_Period,0,MODE_EMA,MA_Applied,i);
                  }
                  for(i=0; i<limit; i++)
                  {
                     buffer[i] = iMAOnArray(tempbuffer,0,MA_Period,0,MODE_EMA,i);
                  }
            }
            break;
     
      case 6:
            {
                  for(i=0; i<limit; i++)
                  {
                     buffer[i] = iCustom(NULL,0,"T3MA",MA_Period,T3MA_VolumeFactor,0,i);
                  }
            }
            break;
      case 7:
            {
                  for(i=0; i<limit; i++)
                  {
                     buffer[i] = iCustom(NULL,0,"JMA",MA_Period,JMA_Phase,0,i);
                  }
            }
            break;
   }

   for(int shift=0; shift<limit; shift++)
   {
       UpBuffer[shift] = buffer[shift];
       DownBuffer[shift] = buffer[shift];
       Buffer3[shift] = buffer[shift];
   }                   
   

   
   for(shift=0; shift<limit; shift++)
   {
      double dMA = 0;
      for(int k = shift+1; k <= shift+Step_Period; k++){
         dMA += buffer[k];
      }
      dMA = dMA / Step_Period;

      if (buffer[shift] < dMA)
      {
         UpBuffer[shift] = EMPTY_VALUE;
      }
      else if (buffer[shift]>dMA)
      {
         DownBuffer[shift] = EMPTY_VALUE;
      }
      else
      {
         UpBuffer[shift] = EMPTY_VALUE;
         DownBuffer[shift] = EMPTY_VALUE;
      }
   }
   for(shift=0; shift<limit; shift++)
   {
         signal[shift]=0;
         if(UpBuffer[shift+1] == EMPTY_VALUE &&  UpBuffer[shift] != EMPTY_VALUE && Buffer3[shift+1] != UpBuffer[shift] )
            {
               DrawObject(1,shift,buffer[shift] - (10*Point));
               signal[shift]=1;
            }
           
         if(DownBuffer[shift+1] == EMPTY_VALUE &&  DownBuffer[shift] != EMPTY_VALUE && Buffer3[shift+1] != DownBuffer[shift])
           {
               DrawObject(2,shift,buffer[shift] + (15*Point));
               signal[shift]=-1;
           }
   }
                     
   if(UpBuffer[1] == EMPTY_VALUE &&  UpBuffer[0] != EMPTY_VALUE && Buffer3[1] != UpBuffer[0])
      return(1);// AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Up Signal",1);
   if(DownBuffer[1] == EMPTY_VALUE &&  DownBuffer[0] != EMPTY_VALUE && Buffer3[1] != DownBuffer[0])   
      return(-1);//AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Down Signal",2);
}
//==============================================================================================//
void DrawObject(int direction, int bar , double price)
{
   static int count = 0;
   count++;
   string Obj = "";
   if (direction==1) //up arrow
   {
      Obj = "xpMA_up_" + DoubleToStr(count,0);
      ObjectCreate(Obj,OBJ_ARROW,0,Time[bar],price);
      ObjectSet(Obj,OBJPROP_COLOR,UpArrowColor);
      ObjectSet(Obj,OBJPROP_ARROWCODE,UpArrowCode);
      ObjectSet(Obj,OBJPROP_WIDTH,DownArrowSize);
   }
   if (direction==2) //down arrow
   {
      Obj = "xpMA_down_" + DoubleToStr(count,0);
      ObjectCreate(Obj,OBJ_ARROW,0,Time[bar],price);
      ObjectSet(Obj,OBJPROP_COLOR,DownArrowColor);
      ObjectSet(Obj,OBJPROP_ARROWCODE,DownArrowCode);
      ObjectSet(Obj,OBJPROP_WIDTH,DownArrowSize);
   }
   ObjectsRedraw();
}
//==============================================================================================//
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 08:16:55
Ответ #7

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
   if(UpBuffer[1] == EMPTY_VALUE &&  UpBuffer[0] != EMPTY_VALUE && Buffer3[1] != UpBuffer[0])
      return(1);// AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Up Signal",1);
   if(DownBuffer[1] == EMPTY_VALUE &&  DownBuffer[0] != EMPTY_VALUE && Buffer3[1] != DownBuffer[0])   
      return(-1);//AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Down Signal",2);

то что Вы сделали через массив уже делается внутри советника , return (); Возвращает Вам для баев 1 для селов -1
Вам уже индикатор не нужен , его код перенесен в советник и будет работать как одно целое.
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 08:20:06
Ответ #8

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
не понял ты поправил Moy.mq4?
или мне код копировать?

28 Январь 2013, 08:21:08
Ответ #9

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
не понял ты поправил Moy.mq4?
или мне код копировать?
Я немного поправил
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 08:24:04
Ответ #10

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
 В вашем случае если я все правильно понял будет так

if ((isNewBar())&&  (OrdersTotal()==0) &&(AccountBalance()>10))// тут немного не правильно
   {
      //level=iCustom(NULL, 0,"xpMA",7,7,0);
     // Alert("level= ", level," такой");//
      if (xMA() == 1)
      {//есть сигнал на покупку и он же сгнал для закрытия селл ордера
         Alert("level= ", xMA()," такой");
         //price=NormalizeDouble(Ask,Digits);
         //stop=NormalizeDouble(price-StopLoss*Point,Digits);
         //profit=NormalizeDouble(price+TakeProfit*Point,Digits);
         //OrderSend(Symbol(),OP_BUY,Lots,price,3,stop,profit,NULL,0,0,Green);
         //Print(AccountBalance());         
      }
      if (xMA() == -1 )
      {//есть сигнал на продажу и он же сгнал для закрытия бай ордера
        Alert("level= ", xMA()," такой");
         //price=NormalizeDouble(Ask,Digits);
         //stop=NormalizeDouble(price+StopLoss*Point,Digits);
         //profit=NormalizeDouble(price-TakeProfit*Point,Digits);
         //OrderSend(Symbol(),OP_SELL,Lots,price,3,stop,profit,NULL,0,0,Green);
         ////Print(AccountBalance());           
      }     
}       

ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 09:15:05
Ответ #11

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
что то в тестере на М15 за период с 23.01 по сегодня только 23.01 в 00:00 купил и все, хотя на графике 23.01 две стрелки вверх одна и одна вниз(и они не в 00:00), да и 24.01 и 25.01 есть сигналы. Что то не так работает.

28 Январь 2013, 09:20:20
Ответ #12

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
что то в тестере на М15 за период с 23.01 по сегодня только 23.01 в 00:00 купил и все, хотя на графике 23.01 две стрелки вверх одна и одна вниз(и они не в 00:00), да и 24.01 и 25.01 есть сигналы. Что то не так работает.
Да я Вам сделал пометку где не правильно ...
Вообще код такой не будет работать правильно. Я имею ввиду вашего советника.  Индикатор в норме.
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

28 Январь 2013, 09:34:56
Ответ #13

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
у меня вот так стоит на открытие ордеров
     if ( xMA() == 1 )
      {
      //есть сигнал на покупку и он же сгнал для закрытия селл ордера
      OrderSend(Symbol(),OP_BUY,1,Bid,3,0,0,NULL,0,0,Green);
      }
      if ( xMA() == -1 )
      {
      //есть сигнал на продажу и он же сгнал для закрытия бай ордера
      OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,NULL,0,0,Green);
      }       
хотя до того пока ты алерты не закомментарил, алерты в журнале правильно отображались в соответствии со стрелками

28 Январь 2013, 09:38:19
Ответ #14

sanya32

  • Новичок

  • Оффлайн
  • *

  • 11
  • Репутация:
    3
я имею ввиду вот эти алерты
if(UpBuffer[1] == EMPTY_VALUE &&  UpBuffer[0] != EMPTY_VALUE && Buffer3[1] != UpBuffer[0])
     return(1);// AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Up Signal",1);
      if(DownBuffer[1] == EMPTY_VALUE &&  DownBuffer[0] != EMPTY_VALUE && Buffer3[1] != DownBuffer[0])   
      return(-1);//AlertOnce(Symbol()+ ":" + PeriodToText() + "  -  Down Signal",2);