торгую в ручную , советника и скрипт написал криво как полагаеться чайнику. помогите исправить

 

для metatreder 4 

использую советника который сигнализирует на отклонение от цены открытия в любую сторону на 10 пунктов

и если сработал стоплосс. неработает как задумал если поставить на несколько графиков. пока не разобрался как сделать.

 


  

int start()
   {
    int total;
    double a,b;
 a=MarketInfo(Symbol(),MODE_ASK);
 b=MarketInfo(Symbol(),MODE_BID);
 total=OrdersTotal();

 if (total<1) {PlaySound("stops.wav"); return(0) ;}

 OrderSelect(0,SELECT_BY_POS,MODE_TRADES);

 if(a-OrderOpenPrice()>0.0010 || b-OrderOpenPrice()<-0.0010) PlaySound("alert.wav");
  
 return(0);
 }

 

 

а так же использую скрипт для закрытия предыдущего ордера и сразуже открытия нового

 



  

int start()

 {
  
 bool result;
 double price;
 int cmd,error1;

 if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
 {
 cmd=OrderType();
    
 if(cmd==OP_BUY || cmd==OP_SELL)
 {
 while(true)
 {
 if(cmd==OP_BUY) price=Bid;
 else price=Ask;
 result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
 if(result!=TRUE) { error1=GetLastError(); Print("LastError = ",error1); }
 else error1=0;
 if(error1==135) RefreshRates();
 else break;
 }
 }
 }
 else Print( "Error when order select ", GetLastError());

   int ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+100*Point,0,"SELL 1",255,0,CLR_NONE);
 if(ticket<1)
 {
 int error=GetLastError();
 Print("Error = ",ErrorDescription(error));
 return;
 }
 PlaySound("alert.wav");
 OrderPrint();
 return(0);
 } 
  

исправте мне мои кривые руки))))

надо чтоб сигнал срабатывал адекватно на каждом из графиков eurusd eurjpy eurcad gbpjpy

было бы круто еслиб график на котором срабатывал сигнал как то визуально отмечался.

спасибо всем кто поможет  подучиться .  

 
Нужно бы отредактировать пост для начала)))) Есть специальная вставка "код"
 
 
au77:

для metatreder 4

использую советника который сигнализирует на отклонение от цены открытия в любую сторону на 10 пунктов

и если сработал стоплосс. неработает как задумал если поставить на несколько графиков. пока не разобрался как сделать.

а так же использую скрипт для закрытия предыдущего ордера и сразуже открытия нового

исправте мне мои кривые руки))))

надо чтоб сигнал срабатывал адекватно на каждом из графиков eurusd eurjpy eurcad gbpjpy

было бы круто еслиб график на котором срабатывал сигнал как то визуально отмечался.

спасибо всем кто поможет подучиться .

Советник лучше сделать индикатором.

#property indicator_chart_window
extern int Distance = 10;        // в пп. для 4-рёх знаков
double gd_Distance;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
    int li_Decimal = 1;
//---- indicators
    if (Digits % 2 == 1) li_Decimal = 10;
    gd_Distance = Distance * li_Decimal * Point;
//----
    return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
    int total = OrdersTotal(), li_ord = 0;
    if (total == 0) return (0);
    double lda_Price[2];
    lda_Price[0] = Bid;
    lda_Price[1] = Ask;
    for (int li_ORD = total - 1; li_ORD >= 0; li_ORD--)
    {
        if (!OrderSelect (li_ORD, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != Symbol()) continue;
        if (OrderType() > 1) continue;
        li_ord++;
        if (MathAbs (lda_Price[OrderType()] - OrderOpenPrice()) > gd_Distance)
        {
            Alert ("На ", Symbol(), " цена вышла из коридора !!!");
            PlaySound ("alert.wav");
            break;
        }
    }
    if (li_ord == 0)
    {
        Alert ("На ", Symbol(), " отсутствуют ордера !!!");
        PlaySound ("stops.wav");
        return (0) ;
    }
    return (0);
}
 //+------------------------------------------------------------------+
 
спасибо сейчас попробую разобраться как работает
 

благодарю!

еще такой вопрос.

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

 
au77:

благодарю!

еще такой вопрос.

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

Ваш код будет работать до момента использования на нескольких инструментах. Иначе нужно проводить фильтрацию ордеров по Символу:

#include     <stdlib.mqh>                          // Библиотека с кодами ошибок
int start()
{
    bool   result, lb_InvalidSTOP;
    double price;
    int    cmd, error1;
    for (int li_ORD = OrdersTotal() - 1; li_ORD >= 0; li_ORD--)
    {
        if (!OrderSelect (li_ORD, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != Symbol()) continue;
        if (OrderType() > 1) continue;
        while (IsTradeAllowed() == true)
        {
            if (!IsExpertEnabled() || IsStopped()) return (0);
            if (OrderType() == OP_BUY) price = Bid; else price = Ask;
            result = OrderClose (OrderTicket(), OrderLots(), price, 3, CLR_NONE);
            if (!result)
            {
                if (fErrorHandling (GetLastError(), lb_InvalidSTOP)) {return (0);}
                RefreshRates();
            }
            else break;
        }
    }
    RefreshRates();
    int ticket = OrderSend (Symbol(), OP_SELL, 0.01, Bid, 3, Ask+100*Point, 0, "SELL 1", 255, 0, CLR_NONE);
    if (ticket < 1)
    {Print ("Error = ", ErrorDescription (GetLastError())); return;}
    else
    {
       OrderSelect (ticket, SELECT_BY_TICKET);
        OrderPrint();
    }
    PlaySound ("alert.wav");
    return (0);
}
 //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY                                                                  |
//+-----------------------------------------------------------------------------------+
//|        Функция обрабатывает ошибки                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fErrorHandling (int fi_Error, bool& fb_InvalidSTOP)
{   
//----
    if (fi_Error == 0) return (true);
    switch (fi_Error)
    {
        case 4:   /*ERR_SERVER_BUSY*/
        case 137: /*ERR_BROKER_BUSY*/
        case 139: /*ERR_ORDER_LOCKED*/
        case 146: /*ERR_TRADE_CONTEXT_BUSY*/
            Sleep (500); return (false);
        case 6:   /*ERR_NO_CONNECTION*/ 
            fReConnect(); Sleep (1000); return (false);
        case 135: /*ERR_PRICE_CHANGED*/ 
        case 136: /*ERR_OFF_QUOTES*/
        case 138: /*ERR_REQUOTE*/
            Sleep (1); return (false);
        case 129: /*ERR_INVALID_PRICE*/
            fb_InvalidSTOP = true; Print ("Не правильные цены - err № ", fi_Error); return (false);
        case 130: /*ERR_INVALID_STOPS*/
            fb_InvalidSTOP = true; Print ("Не правильные стопы - err № ", fi_Error); return (false);
        case 4109: /*ERR_TRADE_NOT_ALLOWED*/
            Print ("TRADE NOT ALLOWED ! SWITCH ON option \' Allow live trading\' (Необходимо включить опцию \'Разрешить советнику торговать\')");
            return (true);
        default: Print (OrderTicket(), ": Критическая ошибка № ", ErrorDescription (fi_Error)); return (true);
    }
//----
    return (true);
}
 
если при отклонении нужно принять решение какое то именно вручную то было бы неплохо вставить messagebox с предложением того или иного действия...этот так....в дополнение=)
Причина обращения: