Помогите пожалуйста советом. Эквиобъемные графики - страница 3

 
datetime last_tick;
void init()
{
... 
//здесь хранить время последнего тика
last_tick=0;
//функцию старт вызываем непосредственно из инициализации
start();
}

void start()
{
   while(!IsStopped())
   {
      //если это не первый вход в цикл,
      //и время последнего тика не изменилось, ждем дальше
      if(last_tick!=0&&last_tick=TimeCurrent()) continue;

      //обновить время последего тика
      last_tick=TimeCurrent();

      //теперь можно сделать всю полезную работу
   }
}
 

Подскажите пожалуйста, как вставить в этот фрагмент кода

void RefreshWindow()
{
        //---- находим окно, в которое будем "отправлять" свежие котировки
        if ( hwnd == 0 )
        {
                hwnd = WindowHandle( StringConcatenate( "!Rng", _Symbol ), PointsInBar );
                if ( hwnd != 0 ) { Print( "< - - - График ", "!Rng", _Symbol, PointsInBar, " найден! - - - >" ); }
        }
        //---- и, если нашли, обновляем его
        if ( hwnd != 0 ) { PostMessageA( hwnd, WM_COMMAND, 33324, 0 ); }
}

строчку

PostMessageA(hwnd,MT4InternalMsg,2,1); //incoming tick for EAs

Komposter - любезно предоставил ссылку на видео, вставляю строчку - но при компиляции выдает ошибку:

'MT4InternalMsg' - variable not defined C:\Program Files\MetaTrader - Alpari\experts\Range.mq4 (202, 20)

 
Вынесите строку в start(), перед вызовом RefresWindow().
 

Я строю советники с помощью программы forex ea generetor и не понимаю куда вписать и что вписать чтоб советник торговал на оффлайн графике самостоятельно. Вот MQL советника помогите и скажите что куда вписать.

//-------------------------------------------------------------
//  Etasoft Inc. Forex EA and Script Generator version 4.1   EA
//-------------------------------------------------------------
// Keywords: MT4, Forex EA builder, create EA, expert advisor developer

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"
#property link      "http://www.forexgenerator.com/"

#include <stdlib.mqh>
#include <WinUser32.mqh>

// exported variables
extern double BalanceRiskPercent15 = 900;
extern double BalanceRiskPercent14 = 900;


// local variables
double PipValue=1;    // this variable is here to support 5-digit brokers
bool Terminated = false;
string LF = "\n";  // use this in custom or utility blocks where you need line feeds
int NDigits = 4;   // used mostly for NormalizeDouble in Flex type blocks
int ObjCount = 0;  // count of all objects created on the chart, allows creation of objects with unique names
int current = 0;



int init()
{
    NDigits = Digits;
    
    if (false) ObjectsDeleteAll();      // clear the chart
    
    
    Comment("");    // clear the chart
}

// Expert start
int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick1();
    
}

void OnEveryTick1()
{
    if (true == false && true) PipValue = 10;
    if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    TechnicalAnalysis13();
    TechnicalAnalysis12();
    IfOrderExists20();
    IfOrderExists21();
    
}

void TechnicalAnalysis13()
{
    if (High[current+1] < High[current])
    {
        IfOrderDoesNotExist10();
        
    }
}

void IfOrderDoesNotExist10()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        BuyOrderRiskFlex15();
        
    }
}

void BuyOrderRiskFlex15()
{
    double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage();
    double pipsize = 1 * 10;
    double maxlots = AccountFreeMargin() / 100 * BalanceRiskPercent15 / lotsize * pipsize;
    double SL = NormalizeDouble(1, NDigits);
    if (SL == 0) Print("OrderSend() error - stoploss can not be zero");
    double SLinPips = MathAbs(SL - (Bid + Ask) / 2) / Point / PipValue;
    double lots = maxlots / SLinPips * 10;
    double lotvalue = 0.001;
    double minilot = MarketInfo(Symbol(), MODE_MINLOT);
    int powerscount = 0;
    while (minilot < 1)
    {
        minilot = minilot * MathPow(10, powerscount);
        powerscount++;
    }
    lotvalue = NormalizeDouble(lots, powerscount - 1);
    
    if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT))    // make sure lot is not smaller than allowed value
    {
        lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
    }
    if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT))    // make sure lot is not greater than allowed value
    {
        lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
    }
    
    
    double TP = NormalizeDouble(0, NDigits);
    if (0 == 0) TP = 0;
    
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 2, 0, 0, "My Expert", 1, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 2, SL, TP, "My Expert", 1, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}

void TechnicalAnalysis12()
{
    if (Low[current+1] > Low[current])
    {
        IfOrderDoesNotExist11();
        
    }
}

void IfOrderDoesNotExist11()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 2)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        SellOrderRiskFlex14();
        
    }
}

void SellOrderRiskFlex14()
{
    double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage();
    double pipsize = 1 * 10;
    double maxlots = AccountFreeMargin() / 100 * BalanceRiskPercent14 / lotsize * pipsize;
    double SL = NormalizeDouble(1, NDigits);
    if (SL == 0) Print("OrderSend() error - stoploss can not be zero");
    double SLinPips = MathAbs(SL - (Bid + Ask) / 2) / Point / PipValue;
    double lots = maxlots / SLinPips * 10;
    double lotvalue = 0.001;
    double minilot = MarketInfo(Symbol(), MODE_MINLOT);
    int powerscount = 0;
    while (minilot < 1)
    {
        minilot = minilot * MathPow(10, powerscount);
        powerscount++;
    }
    lotvalue = NormalizeDouble(lots, powerscount - 1);
    
    if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT))    // make sure lot is not smaller than allowed value
    {
        lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
    }
    if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT))    // make sure lot is not greater than allowed value
    {
        lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
    }
    
    
    double TP = NormalizeDouble(0, NDigits);
    if (0 == 0) TP = 0;
    
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_SELL, lotvalue, Bid, 2, 0, 0, "My Expert", 2, 0, Red);
    else
    ticket = OrderSend(Symbol(), OP_SELL, lotvalue, Bid, 2, SL, TP, "My Expert", 2, 0, Red);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}

void IfOrderExists20()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists)
    {
        TechnicalAnalysis22();
        
    }
}

void TechnicalAnalysis22()
{
    if (Low[current+1] > Low[current])
    {
        CloseOrder24();
        
    }
}

void CloseOrder24()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_BUY || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 2, Red);
            if (ret == false)
            Print("OrderClose() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfOrderExists21()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 2)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists)
    {
        TechnicalAnalysis23();
        
    }
}

void TechnicalAnalysis23()
{
    if (High[current+1] < High[current])
    {
        CloseOrder25();
        
    }
}

void CloseOrder25()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 2)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
        {
            bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 2, Red);
            if (ret == false)
            Print("OrderClose() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}



int deinit()
{
    if (false) ObjectsDeleteAll();
    
    
}
 
MTY:

Я строю советники с помощью программы forex ea generetor и не понимаю куда вписать и что вписать чтоб советник торговал на оффлайн графике самостоятельно. Вот MQL советника помогите и скажите что куда вписать.

Дело не в советнике, а в отсутствии тиков на офлайновом графике. Надо их эммулировать.

Эта библиотека поможет. Есть примеры в тестовом скрипте.


 
Большое спасибо. Но я не смог понять что как нужно сделать :) Я установил Equal Volume bars на график и потом открыл оффлайн график где собираются бары с определенным количеством тиков и потом на этот график установил мой советник а он не торгует и лично я тоже когда хочу купить что-то то открывает совсем другой символ, я так понял что не один терминал не может узнать этот символ так как впереди символа есть !Eqv ... Не знаю как решит это проблему пожалуйста помогите.
Zhunko:

Дело не в советнике, а в отсутствии тиков на офлайновом графике. Надо их эммулировать.

Эта библиотека поможет. Есть примеры в тестовом скрипте.


Причина обращения: