Здравствуйте, гость ( Вход | Регистрация )

26 страниц V « < 13 14 15 16 17 > »   
Ответить в эту темуОткрыть новую тему
> Perceptron, Нейронная сеть
leonid553
сообщение 1.8.2007, 14:46
Сообщение #141





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Понял! И ещё. Обьясни пож. смысл вот этих строк кода (незакоммент):

int start()
{
//vTerminalRefresh();
//-------------------------------------------------------
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }
//-------------------------------------------------------

//if (isNewBar) {

int spread = MarketInfo(Symbol(), MODE_SPREAD);



//----- Вывод информации на экран ------------------------------
----------------------------------------------------------------------------------------

И нужно ли в посл. строке оставить как есть или вместо Symbol(), указать пары?

Все работает в тестере. Но вот пока по второй паре результат не соотв. тесту отдельной версии - чуть-чуть.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 1.8.2007, 17:20
Сообщение #142





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Код
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }


Эта конструкция отслеживает появление нового бара. Переменная isNewBar выступает в качестве ключа. true-появился бар, false-бар не появился. Для работы этой конструкции необходимо объявить на глобальном уровне переменную ExpertBars, а в функции Init() присвоить ей значение Bars.
Теперь давай проследим работу эксперта.
При запуске эксперта первой срабатывает функция Init(), в которой переменной ExpertBars присваивается значение Bars (Bars, возвращает количество баров в терминале). Далее в функции Start() объявляем переменную isNewBar и присваиваем ей false:
Код
bool isNewBar=false;

после чего проверяется условие:
Код
if (ExpertBars !=Bars)

В данный момент переменная ExpertBars хранит значение количества баров, которое было на момент запуска, и в данный момент ExpertBars ==Bars. А не равны они станут только тогда, когда появится новый бар и Bars вернёт значение отличное от ExpertBars. В этот момент выполняются действия
{ExpertBars=Bars; isNewBar=true; }
ExpertBars получает новое значение баров и замок открывается. На следующем тике замок снова закроется:
Код
bool isNewBar=false;


Далее, что бы то что ты хочешь, выполнялось только по приходу бара нужно поместить в эти скобки:
Код
if (isNewBar)
{

}


Код
int spread = MarketInfo(Symbol(), MODE_SPREAD);

Для мультивалютного эксперта символ нужно задать явно. Также нужно предусмотреть несколько таких переменных для каждой пары.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 1.8.2007, 17:52
Сообщение #143





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Благодарю за разъяснение!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 2.8.2007, 19:18
Сообщение #144





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Ещё вопрос
Код
/---- input parameters

extern string  GBPUSD= "Параметры GBPUSD";
extern int     MagicGBP=199;
extern bool    GBP=True;
extern int     GBPUSD_period=17;
extern int     GBP_Env_period=20;
extern int     GBP_Env_shift=1;
extern double  GBP_Env_deviation=17;
extern int     sl_GBPUSD = 54;
extern int     tp_GBPUSD = 50;

extern string _Parameters_Trailing_GBP = "- Параметры Трейлинга GBPUSD -";
extern bool UseTrailing    = false;// Использовать трейлинг
extern bool ProfitTrailing = false;//Включать трейлинг когда получен профит
extern int  TrailingStop   = 10;   // Фиксированный размер трала
extern int  TrailingStep   = 5;    // Шаг трейлинга

//********************************************************************
extern string  USDCHF= "Параметры USDCHF";
extern int     MagicCHF=991;
extern bool    CHF=false;
extern int     USDCHF_period=5;
extern int     CHF_Env_period=25;
extern int     CHF_Env_shift=1;
extern double  CHF_Env_deviation=20;
extern int     sl_USDCHF = 53;
extern int     tp_USDCHF = 30;

extern string _Parameters_Trailing_CHF = "-- Параметры Трейлинга USDCHF--";
extern bool UseTrailing_    = false;// Использовать трейлинг
extern bool ProfitTrailing_ = false;//Включать трейлинг когда получен профит
extern int  TrailingStop_   = 10;   // Фиксированный размер трала
extern int  TrailingStep_   = 5;    // Шаг трейлинга

color    clModifyBuy  = Green;
color    clModifySell = Blue;
color    clModifyBuy_  = Green;
color    clModifySell_ = Blue;

//-- Подключаемые модули ---------------
#include  <stdlib.mqh>
#include  <b-Lots.mqh>  //Переменный лот
//#include  <VisualTestingTools.mq4> //визуализация
//--------------------------------------
static int prevtime = 0;
static int spread   = 3;
//--
int ExpertBars;

Это был блок внешних параметров.

Далее непонятно - куда воткнуть строку для каждой пары
int spread = MarketInfo(Symbol(), MODE_SPREAD);

Код
nt start()
  {

int spread = MarketInfo(Symbol(), MODE_SPREAD);



  
  double Stochastic_array[49];
//------заполняем массив значениями Stochastic GBPUSD -----------
int    i=0;
while (i<50)
{
Stochastic_array[i]=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i);
i++;
}
//------------------------------------------------------
ArraySetAsSeries(Stochastic_array,true);
//-------Цепляем конверт на Стохастик --------------
double
En0_low=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1);

//************* то же самое для  USDCHF ****************************
double Stochastic_array_[49];

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 2.8.2007, 19:50
Сообщение #145





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



А у тебя вообще переменная Spread где-то используется ?
Строка должна быть в функции Start(), а где именно принципиальной разницы нет, главное что бы она была до того места где ты будешь её использоватьsmile.gif
Выглядеть это будет примерно так:
Код
int GBPspread = MarketInfo("GBPUSD", MODE_SPREAD);
int CHFspread = MarketInfo("USDCHF", MODE_SPREAD);

Вот только никак не пойму где ты спрэд используешь в этом советнике ??
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 2.8.2007, 19:58
Сообщение #146





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Я тогда её вот в эти блоки вставлю - хуже не будет (кашу маслом не ...)
Код
//============================= GBPUSD ==================================
if (GBP) {     //если ордеров по паре GBPUSD нет и "выключатель" включен
if (!ExpertOrder(MagicGBP)) {
//-------Проверяем условие на покупку-------------
if  (     (Stochastic_1<En0_low) &&
          (Stochastic_0>En0_low)      )
    {  
  //---- Цикл открытия ордера  -------------------------------------------                      
int Cnt=1;
  while (Cnt <= 5)
  { //-----покупаем--------------
    Lots=GetSizeLot();
    if (OrderSend("GBPUSD", OP_BUY, Lots, Ask, 3, Bid - sl_GBPUSD * Point,
           Ask+tp_GBPUSD* Point,"General", MagicGBP, 0, Blue) > 0)  break;    
    else
{ Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);
                              
        if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
        Sleep(15000); // ждём 15 секунд

А по символу - в тралах там есть - ссылка на символ. И как тут? Оставить как есть? -

Код
////                          TRAILING  STOP  2                             //
//////////////////////////////////////////////////////////////////////////////
if (UseTrailing_ == True)
{
bool   fm_;
int    err_;
double ldOpen_=0;
double ldTake_=0;

for (int r=0; r<OrdersTotal(); r++)                                  {
    if (OrderSelect(r, SELECT_BY_POS, MODE_TRADES))                   {
     if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicCHF)      {
      if (OrderType()==OP_BUY)                                          {
       if (!ProfitTrailing_ || (Bid-OrderOpenPrice())>TrailingStop_*Point) {
        if (OrderStopLoss()<Bid-(TrailingStop_+TrailingStep_-1)*Point)      {
              //ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
              
                ldOpen_=OrderOpenPrice();
                ldTake_=OrderTakeProfit();
        
              if (IsTradeAllowed()) {
fm_=OrderModify(OrderTicket(),ldOpen_,Bid-TrailingStop_*Point,ldTake_,0,clModifyBuy_);
              if (!fm_) {
              err_=GetLastError();
              Print("Error(",err_,") modifying SL: ");
             }
            }  
           }
          }
         }
        if (OrderType()==OP_SELL) {
     if (!ProfitTrailing_ || OrderOpenPrice()-Ask>TrailingStop_*Point) {
if (OrderStopLoss()>Ask+(TrailingStop_+TrailingStep_-1)*Point || OrderStopLoss()==0) {
              //ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
              
                ldOpen_=OrderOpenPrice();
                ldTake_=OrderTakeProfit();
              
              if (IsTradeAllowed()) {
fm_=OrderModify(OrderTicket(),ldOpen_,Ask+TrailingStop_*Point,ldTake_,0,clModifySell_);
              if (!fm_) {
              err_=GetLastError();
              Print("Error(",err_,") modifying SL: ");
              }
             }  
            }
           }
          }
         }
        }
       }
      }
/////////////////////////////////////////////////////////////////////////////////
//////                  end of  TRAILING  STOP 2                              ////
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 3.8.2007, 6:30
Сообщение #147





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Нет, как есть нельзя оставлять. Тралить не будет вторую пару. Вместо Period(), нужно прописать конкретную пару.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 3.8.2007, 9:34
Сообщение #148





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Ок! Вставил вместо Symbol() в тралах - названия пар.
Теперь вот вроде заметил глюк при торговле. Причем в изначальной отдельной версии.
Но сначала вот что :
---------------------------------------------------------
------Проверяем условие на покупку-------------
if ( (Stochastic_1<En0_low) &&
(Stochastic_0>En0_low) )
----------------------------------------------------------
Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ!
но так бывает далеко не всегда. Ведь сначала будет
----------------------------------------------------------
(Stochastic_1<En0_low) &&
(Stochastic_0=En0_low)

потом станет -
(Stochastic_1=En0_low) &&
(Stochastic_0>En0_low) )

------------------------------------------------------------------
А условие кот. выше - может и так и не наступить!Как ты думаешь, - нет ли здесь у нас некоторой непродуманности условий на вход?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 3.8.2007, 10:07
Сообщение #149





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Цитата
Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ!

Не на ТИКАХ, а на барах.
Думаю что с условием всё впорядке, т.к. по стратегии нужно входить по пробою границы конверта. А пробой мы можем идентифицировать только так: на предыдущем баре стохастик ниже границы, на текущем он уже выше границы.
И почему это условие у нас может не наступить?
Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 3.8.2007, 11:53
Сообщение #150





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Как это, - " не на тиках а на барах" ?
Советник работает по тикам! , - не по ценам открытия!
Условие
if (isNewBar)
{ }
я убрал!
Код
En0_low=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1);

"Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала."
ну, впрочем, с этим понятно!
Гороздо больше беспокоит другое! Отслеживал в визуальном режиме одиночную версию и вроде обнаружил глюк, - разумеется,, не в нашу пользу!
Но сначала проясни вопрос " по барам или по тикам"?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

26 страниц V « < 13 14 15 16 17 > » 
Ответить в эту темуОткрыть новую тему

 



- Текстовая версия Сейчас: 4.8.2025, 11:36