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

 
Vinin:


if (c % 2==0) //четное


Я бы не стал проверять double на равенство с чем-нибудь.
 
Подскажите пожалуйста, как пробежаться через цикл for по уже закрытым убыточным ордерам??? А может уже есть у кого функция: при закрытой убыточной сделке, умножаем лот?
 
tara:

Я бы не стал проверять double на равенство с чем-нибудь.


Я вроде бы предварительно написал что только для целых. Или Вы плохо читаете?

NickXXX:

Вопрос на засыпку.)

Как определить программно является ли число четным или нечетным?

Например:

int a, b, c;

a=2;

b=3;

c=a+b

c - чет или нечет?



Если числа целые, то надо проверять остаток от деления на 2

if (c % 2==0) //четное

 

поясните по ошибкам кода


avatar
2
Qwuyt 18.09.2011 11:56

Добрый день!

Прошу кому не лень посмотреть код и подсказать в чем мои ошибки. При компиляции выдает кучу ошибок. Это мой первый советник, только начинаю разбираться. Идея советника следующая: в понедельник в заданное время выставляем отложенные ордера в обе стороны на расстоянии Икс пунктов от закрытия прошлой недели. В пятницу в заданное время закрываем рыночные ордера, удаляем имеющиеся отложенные. Все.

//+------------------------------------------------------------------+
//|                                                         Week.mq4 |
//|                                          Copyright © 2011, Qwuyt |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Qwuyt"
#property link      ""

//--- input parameters
extern double    lot=0.01;                                                 //размер лота 
extern int       tp=200;                                                   //тейк профит
extern int       sl=50;                                                    //стоплосс
extern int       move=100;                                                 //движение цены 
extern int       hc=22;                                                    //час закрытия 
extern int       ho=4;                                                     //час закрытия
double BP;                                                                 //цена открытия бай
double SP;                                                                 //цена открытия селл
int Ticket;                                                                
int Tip;                                                                   //тип ордера
int Curday;                                                                //день недели
bool Ans = false;                                                          //ответ сервера после закрытия ордера
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()                               
  {
  int Curday = DayOfWeek                                    
  double BP = iClose(NULL,10080,1)+NormalizeDouble(move*Point,Digits);     //      
  double SP = iClose(NULL,10080,1)-NormalizeDouble(move*Point,Digits);
    if (ho >= Hour && Curday=1)                                            //4 утра понедельника - открытие бай
    {
    OrderSend (Symbol(),OP_BUYSTOP,lot,BP,3,sl,tp,NULL,0,0,Red)
    }
    if (ho >= Hour && Curday=1)                                            //4 утра понедельника - открытие селл
    {
    OrderSend (Symbol(),OP_SELLSTOP,lot,SP,3,sl,tp,NULL,0,0,Red)
    }
    while(true)                                                           //цикл закрытия орд.
     {
      if (Tip==0 && hc >= Hour && Curday=6)                               // Открыт ордер Buy, 22 часа пятницы закрыть
        {                                                                 //
         RefreshRates();                                                  // Обновление данных
         Ans=OrderClose(Ticket,lot,Bid,3);                                // Закрытие Buy
         return;                                                          // Выход из start()
        }
      if (Tip==1 && hc >= Hour && Curday=6)                               // Открыт ордер Sell, 22 часа пятницы закрыть
        {                                                                 //

         RefreshRates();                                                   // Обновление данных
         Ans=OrderClose(Ticket,lot,Bid,3);
         return;                                                          // Выход из start()
        }
      if (Tip==4||Tip==5 && hc >= Hour && Curday=6)                               // Открыт ордер Buy, 22 часа пятницы закрыть
        {                                                                 //
         RefreshRates();                                                  // Обновление данных
         Ans=OrderDelete(Ticket,CLR_NONE);                                // Закрытие Buy
         return;                                                          // Выход из start()
        }
      break;                                                               // Выход из while
     }
     Tip = OrderType();
return();
  }
Прикрепленные файлы:
Week_1.mq4 (4.52 KB)



929
abolk 18.09.2011 12:00правка | удалить

для начала:

1) расставьте ; в конце каждого оператора

2) используйте правильно функции, например Hour()

 
Falmera:
Подскажите пожалуйста, как пробежаться через цикл for по уже закрытым убыточным ордерам??? А может уже есть у кого функция: при закрытой убыточной сделке, умножаем лот?

ну подскажите плиз
 
Falmera:

ну подскажите плиз


покажите свои собственные попытитки реализовать эту функцию - ветка-то "помощь новичкам".

или воспользуйтесь поиском "поиск последнего закрытого ордера" или подобное - тема давно "обсосана до дыр"

 
Falmera:

ну подскажите плиз

См. совы ветки Лавина.
 

Я изучаю язык программирования, и уперся в непонятное поведение программы. Написал советник по мотивам учебника, но переиначил, на немного другой принцип действия.

Советник на основе 2 мувинг аверендж. Затея простая, мувинги пересекаются, ордер закрывается, а противоположный открывается. Написал советник, он работает нормально. В небольшой минус конечно, но в соответствии с идеей. Вся затыка в следующем(выделил жирным):

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D

Стоит мне поменять способ вычисления скользящих средних(может плюс покажет), и вместо простого ( MODE_SMA) поставить экспоненциальный (MODE_EMA), а также еще один(MODE_SMMA),так называемый сглаженный метод, все сразу становится наперекосяк. Принцип работы становится забавным(на тестере стратегий), советник открывает ордер в самом начале заданного периода времени, и закрывает в конце. Т.е. за год он открывает одну единственную сделку в начале периода, и закрывает в конце. В результате советник мне показал плюс, но такой плюс мне не нужен. Я и сам могу подкинуть монетку и открыть ордер либо бай либо селл, и через год посмотреть, в плюсе буду или в минусе. Кстати если вместо MODE_SMA поставить MODE_LWMA (Линейно-взвешенное скользящее среднее), программа работает нормально.

Подскажите пожалуйста, что не так? Ведь принцип тот же, просто немного изменен способ вычисления скользящих средних.

Весь код программы в прикрепленном файле.


Мне тут отвечали, но не компетентно и не по существу. Якобы я использую 4 мувинга. Это не так, мувингов два, но для каждого мувинга взяты значения для двух баров (итого 4 вызова массива, A, B, C, D):1 и 2 . Кроме того писали, что якобы при закрытии ордера следует уменьшать количество ордеров Total, но в этом нет необходимости, так как учет ордеров ведется с помощью функции Odertotal, и если я закрываю ордер, ордертотал сам изменяет свое значение при следующей итерации. Еще предлагали для учета ордеров использовать так называемые магические числа, до этого раздела в учебнике я еще не дошел. Повторяю, программа работает при MODE_SMA и MODE_LWMA и не работает при MODE_EMA и MODE_SMMA. Кто знает почему, напишите мне ответ плиззз.

Файлы:
 
Falmera:

ну подскажите плиз
топайте в тему лавина, там советников хватает с любым приращением лота... поиск по форуму вверху справа или через гугл.
 
neisseria:

Я изучаю язык программирования, и уперся в непонятное поведение программы. Написал советник по мотивам учебника, но переиначил, на немного другой принцип действия.

Советник на основе 2 мувинг аверендж. Затея простая, мувинги пересекаются, ордер закрывается, а противоположный открывается. Написал советник, он работает нормально. В небольшой минус конечно, но в соответствии с идеей. Вся затыка в следующем(выделил жирным):

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D

Стоит мне поменять способ вычисления скользящих средних(может плюс покажет), и вместо простого ( MODE_SMA) поставить экспоненциальный (MODE_EMA), а также еще один(MODE_SMMA),так называемый сглаженный метод, все сразу становится наперекосяк. Принцип работы становится забавным(на тестере стратегий), советник открывает ордер в самом начале заданного периода времени, и закрывает в конце. Т.е. за год он открывает одну единственную сделку в начале периода, и закрывает в конце. В результате советник мне показал плюс, но такой плюс мне не нужен. Я и сам могу подкинуть монетку и открыть ордер либо бай либо селл, и через год посмотреть, в плюсе буду или в минусе. Кстати если вместо MODE_SMA поставить MODE_LWMA (Линейно-взвешенное скользящее среднее), программа работает нормально.

Подскажите пожалуйста, что не так? Ведь принцип тот же, просто немного изменен способ вычисления скользящих средних.

Весь код программы в прикрепленном файле.


Мне тут отвечали, но не компетентно и не по существу. Якобы я использую 4 мувинга. Это не так, мувингов два, но для каждого мувинга взяты значения для двух баров (итого 4 вызова массива, A, B, C, D):1 и 2 . Кроме того писали, что якобы при закрытии ордера следует уменьшать количество ордеров Total, но в этом нет необходимости, так как учет ордеров ведется с помощью функции Odertotal, и если я закрываю ордер, ордертотал сам изменяет свое значение при следующей итерации. Еще предлагали для учета ордеров использовать так называемые магические числа, до этого раздела в учебнике я еще не дошел. Повторяю, программа работает при MODE_SMA и MODE_LWMA и не работает при MODE_EMA и MODE_SMMA. Кто знает почему, напишите мне ответ плиззз.


Я бы еще условия лишний раз проверил. Собака может быть там зарыта
Причина обращения: