Помогите прописать УСЛОВИЕ

 

Я не пишу программ потому, что не умею (о чём сожалею). Иногда очень хочется что нибудь изменить или добавить, но ....как говориться не дано. Поэтому обращаюсь к тем кому не в тягость поправить мои ошибки если они не глобальны. Или если я ошибаюсь в принципе, то буду рад услышать мнения и готов к продолжению разговора с тем кто видит правильное решение моей задачи. Кому то моя задача покажется очень знакомой. И это правильно. Многие начинают с изучения и попыток улучшить (в своём понимании) того, что уже написано и я не исключение.

Задача такая:

Необходимо выставлять отложенный ордер BUYSTOP или SELLSTOP на определённом расстоянии (шага-N) от текущей цены. TP SL выставлю самостоятельно.

Условие:

Если: (цена установки предыдущего BUYSTOP) - Ask(текущей цены) >=N

выставлять отложенный ордер BUYSTOP

или

Если: Bid(текущей цены) - (цена установки предыдущего SELLSTOP) >=N

выставлять отложенный ордер SELLSTOP

Спасибо всем кто примет участие и окажет помощь.

 

Попробуйте так (пример для байстопа, для др. типа по аналогии сделаете сами)):

extern int        MAGIC   = 1000;
extern int        Шаг     = 15; //Расстояние между ордерами В пунктах
extern double   lot      = 0.1; //Размeр лота
extern string Name_Expert   = "Хи-Хи, тра-ля-ля";
            // Комментарий в терминале мт4
int ticket;
//-- Подключаемые модули --
#include <stdlib.mqh>
#include <stderror.mqh>
//-------------------------------------

void start() {
//----------------------------------------
double pAsk=Ask+(Шаг)*Point;// задаем цену установки ордера байстоп
if  (!ExistOPNearMarket(NULL,OP_BUYSTOP,MAGIC, (2*Шаг) )) {
//если на расстоянии (2*Шаг) от текущ. цены нет байстоп-отложек
if  (!ExistOPNearMarket(NULL,OP_BUY,MAGIC, (2*Шаг) )) {
//  и нет открытых позиций c заданным магиком
// выствляем ордер байстоп на раст. Шаг от текущ.цены
ticket= OrderSend(Symbol(),OP_BUYSTOP,lot,pAsk,Slippage,
    0,0, Name_Expert ,MAGIC, 0, DarkBlue);
if(ticket<0){Print("Ошибка установки ордера BUYSTOP ",GetLastError());return(0);} 
}}
//------------------------------------------------
}//--------------- конец функции СТАРТ --------


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь // Игорю - низкий поклон и уважение !                |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                  |
//|  Описание : Возвращает флаг существования позиции или
//| ордера около рынка                                                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|sy - наименование инструмента ("" или NULL - текущийсиммвол) |
//|    op - торговая операция               (    -1      - любая операция)     |
//| mn - MagicNumber                     (    -1      - любой магик)        |
//|ds - расстояние в пунктах от рынка(1000000   - по умолчанию) |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarket(string sy="", int op=-1, int mn=-1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if ((OrderSymbol()==sy) && (op<0 || ot==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {
            if (MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) return(True);
          }
          if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
            if (MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) return(True);
          }}}}}  return(False); }

/Функция ExistOPNearMarket().
//Данная функция возвращает флаг существования ордера или позиции около рынка
// (на заданном расстоянии в пунктах от рынка). Более точный отбор проверяемых 
//ордеров или позиций задаётся внешними параметрами:
//sy - Наименование инструмента. Если задать этот параметр, то функция проверит
// ордера или позиции только заданного инструмента. "" или NULL означает 
//текущий инструмент. 
//op - Торговая операция, тип ордера или позиции. Допустимые значения: OP_BUY,
// OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP или -1. 
//Значение по умолчанию -1 означает любую торговую операцию. 
//mn - Идентификатор ордера или позиции (MagicNumber). Значение по умолчанию -1
// - любой идентификатор. 
//ds - Расстояние от рынка в пунктах. Значение по умолчанию 1000000. 

 
rid писал(а) >>

Попробуйте так (пример для байстопа, для др. типа по аналогии сделаете сами)):

/Функция ExistOPNearMarket().
//Данная функция возвращает флаг существования ордера или позиции около рынка
// (на заданном расстоянии в пунктах от рынка). Более точный отбор проверяемых
//ордеров или позиций задаётся внешними параметрами:
//sy - Наименование инструмента. Если задать этот параметр, то функция проверит
// ордера или позиции только заданного инструмента. "" или NULL означает
//текущий инструмент.
//op - Торговая операция, тип ордера или позиции. Допустимые значения: OP_BUY,
// OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP или -1.
//Значение по умолчанию -1 означает любую торговую операцию.
//mn - Идентификатор ордера или позиции (MagicNumber). Значение по умолчанию -1
// - любой идентификатор.
//ds - Расстояние от рынка в пунктах. Значение по умолчанию 1000000.

Большое спасибо. Разбираюсь. Получится-похвалюсь.

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