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

 
paladin80:
По моему опыту самый эффективный способ поиска ошибок это вывод сообщений в комментариях с номером ошибки с последующим визуальным прогоном советника. В начале занимает много времени, но потом быстро научишься делать без ошибок. Также исключая части кода с помощью /* ... */ можно определить как изменяется поведения советника.
Делаю, точно также))
 
alsu:
Вы все правильно поняли. Далее, когда мы достали значение из коробки, оно имеет тип double, но если дана команда записать результат в переменную типа int, компилятор автоматически проделает все необходимые действия, чтобы положить значение в новую коробочку.


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

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

тогда в строке:

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

Мы положили для хранения переменную целого типа Experts в коробочку "GV-переменная" (преобразовав ее в тип double). Тогда если бы (гипотетическое предположение) в эксперте была бы строка

int New_Experts=Experts;

то это бы означало, что дана команда записать результат в переменную типа int. В этом случае компилятор:

* вынул бы из коробочки значение переменной Experts типа double,

* проделал бы все необходимые изменения со значением переменной Experts,

* приписал бы это значение переменной New_Experts и...

* положил бы значение переменной New_Experts в коробочку "int".

Т.о. тип переменной - есть ничто иное, как просто внешняя обертка/упаковка какого-либо значения? и поэтому GV-переменные не могут иметь тип string, т.к. понижение типа допускается только для численных значений, а строки в числа не преобразовываются.

Так?

Заранее благодарю за ответ

 
Stells:
что не так for (f=1;f<Bars;f++)
{
Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT);
Price2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Spread = Price1 - Price2;
Print ("Price1="+Price1, " Price2="+Price2);
if (Spread==0){t=f; break;}
}
Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Price12 - Price22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { открывем сделку }


хочу зафиксировать бар, где раздвижка была равно нулю и от него контролировать раздвижку

if(MathAbs(Spread)<eps) { ........ } и нужно еще контролировать результат - найдена ли точка, удовлетворяющая условию или нет. ИМХО, лучше оформить отдельной функцией, например, так:

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

здравствуйте.

кто знает, есть в индикаторах какой-нибудь #property, что бы индикатор показывал всегда один и тот же период, к примеру d1?

и не переключался, даже если переключаешь тайм фрейм в метатрейдере?

спасибо

------------------------------------------

ох... как много профи.....

 

помогите!!!!

как вызвать индикатор из скрипта, очень надо - чтобы он после стал отображаться на окошке

 

добрый вечер! Помогите пожалуйста внести изменения в код советника.А именно:
1. При тестировании все нормально - но при торговле первую сделку приходится открывать вручную, стоп и тейк выставлять тоже. Хотелось бы что бы при активации советника и приходу цены на новый тик советник начал торговать автоматически.
2. Так как при срабатывании стоп лосса следующая позиция открывается с удвоенным лотом от предыдущего, то лот теоретически может увеличиватья до бесконечности ( в моем случае до 51,2 ) хотелось бы ограничить его (например 0,8) с возможностью поменять порог. При достижении порога и срабатывании стопа что бы советник не отключался, а начинал бы все заново с 0,1.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Знатоки помогите пожалуйста. Целы день колошматюсь не какого толка.

Ордер стоит на подхвате(Главный БАЙ, отложенный СЕЛЛСТОП подстраховка)

При закрытии СЕЛЛСТОП в без убытке, откладывается опять же в тоже самое место.

Покрутите вот эту штуку, https://www.mql5.com/ru/code/8846 .
 
7777877:


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

тогда в строке:

Мы положили для хранения переменную целого типа Experts в коробочку "GV-переменная" (преобразовав ее в тип double). Тогда если бы (гипотетическое предположение) в эксперте была бы строка

то это бы означало, что дана команда записать результат в переменную типа int. В этом случае компилятор:

* вынул бы из коробочки значение переменной Experts типа double,

* проделал бы все необходимые изменения со значением переменной Experts,

* приписал бы это значение переменной New_Experts и...

* положил бы значение переменной New_Experts в коробочку "int".

Т.о. тип переменной - есть ничто иное, как просто внешняя обертка/упаковка какого-либо значения? и поэтому GV-переменные не могут иметь тип string, т.к. понижение типа допускается только для численных значений, а строки в числа не преобразовываются.

Так?

Заранее благодарю за ответ

Не совсем так. Дело в том, что переменная Experts уже имеет тип int, следовательно, преобразование типа должно произойти ДО присвоения ей значения, т.е. компилятор

* вынул из коробочки значение типа double (оно не имеет имени в вашей программе, а записывается просто в некий известный компилятору адрес в оперативной памяти или в регистр процессора)

* проделал все необходимые изменения со значением вышеуказанной переменной и записал новое значение (уже типа int!) в переменную Experts,

* приписал это значение (типа int!) переменной New_Experts. Они имеют одинаковый тип, следовательно, тут просто переброска значения из одной ячейки памяти в другую.


P.S. Очень радует наличие персон, которые настолько подробно осмысливают свои деяния. На самом деле, без шуток. Обращайтесь еще.

 
Andrew1001:

добрый вечер! Помогите пожалуйста внести изменения в код советника.А именно:
1. При тестировании все нормально - но при торговле первую сделку приходится открывать вручную, стоп и тейк выставлять тоже. Хотелось бы что бы при активации советника и приходу цены на новый тик советник начал торговать автоматически.
2. Так как при срабатывании стоп лосса следующая позиция открывается с удвоенным лотом от предыдущего, то лот теоретически может увеличиватья до бесконечности ( в моем случае до 51,2 ) хотелось бы ограничить его (например 0,8) с возможностью поменять порог. При достижении порога и срабатывании стопа что бы советник не отключался, а начинал бы все заново с 0,1.


Пробуйте:

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Здравствуйте. Подскажите где можно почитать как совершать сделки в тестере, самому. Спасибо.
Причина обращения: