Ваши вопросы по языку MQL4

matro3

Почетный гражданин
Подскажите пж, код расчета лота.
Кто каким пользуется?
 

ansol

Местный знаток
MarketInfo(Symbol(),MODE_MARGINREQUIRED)
MODE_MARGINREQUIRED 32 Размер свободных средств, необходимых для открытия 1 лота на покупку
Если средства поделить на это дело, то узнаешь, на сколько лотов хватит бабла :)
Или что интересует-то?
 

eevviill

Заблокирован
Подскажите пж, код расчета лота.
Кто каким пользуется?

PHP:
extern double Lot = 0.1;
extern bool use_percent_of_deposit = false;
extern double Risk = 1;
int nor_lot=2;

//////////////////////////////////////////////////////////////
void init()
{  
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) nor_lot=1;
}

//////////////////////////////////////////////////////////////
void start()
{  
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) nor_lot=1;
//расчёт лота от % депозита
 if(use_percent_of_deposit) Lot=GetLot();
}

///////////////////////////////
double GetLot()
{
 double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) return(0.0);
 
return(NormalizeDouble(Lot,nor_lot));
}
 

qqmber

Почетный гражданин
В этой строке в скобках делим на Step а потом умножаем на него.
Конечно идет округление, но они же сократятся (согласно тому что мы проходим в школе на математике).
В старших классах вам расскажут, что аргументы нелинейной функции не сокращаются с ее множителями.
 

matro3

Почетный гражданин
)))
Спасибо. А теперь волнующий вопрос:
Нужно вычислить профит ордера за минусом комиссии, спреда, свопа.

PHP:
OrderProfit()-OrderCommission()-OrderSwap()-MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_TICKVALUE)*OrderLots();
Чую что как-то так, но не уверен.
 

Ugar

Гуру форума
)))
Спасибо. А теперь волнующий вопрос:
Нужно вычислить профит ордера за минусом комиссии, спреда, свопа.

PHP:
OrderProfit()-OrderCommission()-OrderSwap()-MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_TICKVALUE)*OrderLots();
Чую что как-то так, но не уверен.
Прибыль ордера в валюте
OrderProfit()+OrderCommission()+OrderSwap()
 

matro3

Почетный гражданин
Да, верно. Комиссия ведь отрицательна.
А как учесть спред?
 

matro3

Почетный гражданин
Вот спрэд в валюте котировки.
PHP:
MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_POINT)
 

ansol

Местный знаток
Да, верно. Комиссия ведь отрицательна.
А как учесть спред?

При открытии ордера ордерпрофит равен минус спреду, т.е. ордер профит показывает реальный профит с учетом спреда, ничего отдельно считать не надо
 

Milord

Местный знаток
Вопрос ПРОГГЕРАМ?)

уважаемые коллеги, не пинайте меня сильно, я начинающий проггер:D
вопрос на тему "Условного оператора" if-else, в справке MQL4 написана форма записи такая:
if (выражение)
оператор1
else
оператор2

нахожу запись в других разделах справки такого вида:
if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderClose(order_id,1,Ask,3,Red);
return(0);
}
и вроде все было ясно, до тех пор, пока не увидел такую запись:not-good:
if(IsOptimization()) return(0);

помогите плиз, понять логику работы этой строчки, и почему не пишется знаки <>+-=
ЗАРАНЕЕ СПАСИБО!
 
Последнее редактирование:

ansol

Местный знаток
Выражение для if должно возвращать TRUE или FALSE, как, например, результат сравнения. IsOptimisаtion() возвращает TRUE, если идет оптимизация и FALSE, если не идет, т.е. вся строка выполняет возврат из подпрограммы в случае работы в режиме оптимизации.
 

Milord

Местный знаток
Выражение для if должно возвращать TRUE или FALSE, как, например, результат сравнения. IsOptimisаtion() возвращает TRUE, если идет оптимизация и FALSE, если не идет, т.е. вся строка выполняет возврат из подпрограммы в случае работы в режиме оптимизации.
то есть данная строка эквивалентна записи:
if(IsOptimization()==TRUE)
{
return(0);
}
но почему так и не записать???
 

ansol

Местный знаток
то есть данная строка эквивалентна записи:
if(IsOptimization()==TRUE)
{
return(0);
}
но почему так и не записать???

Да ради бога! :D
А зачем?
Кстати, если Х равно 0, то if(X) не выполнится или if(!X) наоборот, выполнится, т.е. 0 - это FALSE, а не 0 - TRUE ;)
Очень удобно!
 

Maxsims

Новичок форума
Здравствуйте. Прошу помочь в одном вопросе. Как добавить функция в советник, чтобы после получения стоп-лосса, сов не спешил открывать сделки, а ждал какое-нибудь заданное время. А то часто бывает стоп получен и тут же сов ставит снова ордер и снова стоп получает, и так раза по 3-4 подряд, когда сильная коррекция идет.
 

ansol

Местный знаток
Здравствуйте. Прошу помочь в одном вопросе. Как добавить функция в советник, чтобы после получения стоп-лосса, сов не спешил открывать сделки, а ждал какое-нибудь заданное время. А то часто бывает стоп получен и тут же сов ставит снова ордер и снова стоп получает, и так раза по 3-4 подряд, когда сильная коррекция идет.

1. Можно пропускать пипсы, т.е. подождать пока цена отползет на N*Point
2. Можно пропускать тики, т.е. подождать, пока пройдет N тиков по значению Volume()
3. можно просто "заморозить" сову на несколько (милли)секунд Sleep()

Ммм?
 

eevviill

Заблокирован
Как такое может быть?
FirstVisibleBar() нету функции, а компилятор не ругается.

PHP:
//+------------------------------------------------------------------+
//|                                                  ChartScroll.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//#include <WinUser32.mqh>

 //dobavleno
//#import "user32.dll"
    //int RegisterWindowMessageA (string param);
//#import
 //konec dobavki


int      MT4InternalMsg=0;
datetime first_pos;
int      periods[5]={ PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1 };
int      handles[5];


int init()
  {
//----
   //MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   Print("Registered message ",MT4InternalMsg);
   first_pos=Time[FirstVisibleBar()];
//----
   for(int i=0; i<5; i++)
     {
      if(periods[i]!=Period())
        {
         handles[i]=WindowHandle(Symbol(),periods[i]);
         if(handles[i]==NULL) Print(Symbol(),",",periods[i]," not found");
        }
      else handles[i]=NULL;
     }
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   datetime pos;
//----
   while(!IsStopped())
     {
      pos=Time[FirstVisibleBar()];
      if(first_pos!=pos)
        {
         first_pos=pos;
         for(int i=0; i<5; i++)
           {
            //if(handles[i]!=NULL) PostMessageA(handles[i],MT4InternalMsg,55,first_pos+periods[i]*60);
           }
        }
      Sleep(100);
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

qqmber

Почетный гражданин
Как такое может быть?
FirstVisibleBar() нету функции, а компилятор не ругается.

Это устаревшая функция, в 200 билде ее переименовали в WindowFirstVisibleBar().
Компилятор, тем не менее, про нее помнит и будет корректно обрабатывать.
 
Верх