Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
На самом деле мне очень интересно не просто смотреть такие ветки, а именно изучать. Но изучить то здесь особо нечего, применяется СБ, поэтому что-то понять с изложенного крайне сложно, да и не интересно вовсе.
Преподаватель, настоящий преподаватель -- всегда работает над тем, чтобы его материал был усвоен аудиторией. Он не просто читает лекцию или ведёт занятие -- он слушает аудиторию, он чувствует аудиторию, он живёт пониманием аудитории.
Карпутову же просто нравится что-то пояснять. И ему совершенно без разницы, понимает аудитория его пояснения или нет.
К сожаланиею, ..., хотя, может и к счастью. По факту, полезна любая, даже самая бездарная и бестолковая лекция. Её польза уже в том, что народ видит и понимает как не нужно делать.
Я вижу налетели "доктора психологии" и "костоправы" :) - пытаются кого-то обсуждать и винить, а по сути сами остаются РВАЧАМИ и ничего не дающие сообществу. Если можете что-то дать сообществу - пожалуйста, создавайте и показывайте, только не нужно ГАДИТЬ в каждой ветке.
Я вижу налетели "доктора психологии" и "костоправы" :) - пытаются кого-то обсуждать и винить, а по сути сами остаются РВАЧАМИ и ничего не дающие сообществу. Если можете что-то дать сообществу - пожалуйста, создавайте и показывайте, только не нужно ГАДИТЬ в каждой ветке.
На самом деле, всё не так, никто и ни чему не собирается учить и лечить.
Вопрос в том, что при работе с СБ идет обращение к "чёрному ящику", и мало кто знает, что там находится, но это не самое главное, важнее то, что при обновлении платформы может обновиться и СБ с каким нибудь очередным косяком, и благо, если это произойдёт в тот момент, когда программа не будет работать на реальном счёте.
Я всегда предпочитаю пользоваться написанными функциями именно внутри программы, а не подключать неизвестно что, пусть размер файла немного больше, но всегда в нём уверен.
Поэтому для того чтоб действительно показать как писать и что, не нужно использовать "чёрные ящики". Извините за критику, но она на мой взгляд конструктивная.
На самом деле, всё не так, никто и ни чему не собирается учить и лечить.
Вопрос в том, что при работе с СБ идет обращение к "чёрному ящику", и мало кто знает, что там находится, но это не самое главное, важнее то, что при обновлении платформы может обновиться и СБ с каким нибудь очередным косяком, и благо, если это произойдёт в тот момент, когда программа не будет работать на реальном счёте.
Я всегда предпочитаю пользоваться написанными функциями именно внутри программы, а не подключать неизвестно что, пусть размер файла немного больше, но всегда в нём уверен.
Поэтому для того чтоб действительно показать как писать и что, не нужно использовать "чёрные ящики". Извините за критику, но она на мой взгляд конструктивная.
Не понимаю, что Вы так прицепились к слову "Стандартная библиотека"? Тем более, что любой класс - это ни в коем случае не чёрный ящик - все файлы открыты, доступны и всегда можно просмотреть реализацию методов.
Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - но это не совсем другая история и не в контексте данного топика.
Шаг десять: CPositionInfo - класс для для упрощенного доступа к свойствам открытой рыночной позиции.
Класс CPositionInfo
Класс CPositionInfo является классом для упрощенного доступа к свойствам открытой рыночной позиции.
Описание
Класс CPositionInfo обеспечивает доступ к свойствам открытой рыночной позиции.
Заголовок
#include <Trade\PositionInfo.mqh>
Из всего многообразия будем использовать такие методы:
Доступ к целочисленным свойствам
PositionType
Получает тип позиции
Magic
Получает идентификатор эксперта, открывшего позицию
Доступ к текстовым свойствам
Symbol
Получает наименование символа позиции
Выбор
SelectByIndex
Выбирает позицию по индексу
И, как обычно, для того, чтобы начать использовать любой класс, этот класс нужно включить в нашу программу:
#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
CSymbolInfo m_symbol; // symbol info object
CTrade m_trade; // trading object
CPositionInfo m_position; // trade position object
//--- input parameters
Работа с позициями очень проста:
А вот, как это будет уже в нашем эксперте:
напишем отдельную функцию, которая будет закрывать позиции только определённого типа, по нужному символу и с определённым идентификатором эксперта:
//| Close Positions |
//+------------------------------------------------------------------+
void ClosePositions(ENUM_POSITION_TYPE pos_type,const string symbol,const ulong m_magic)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current orders
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
if(m_position.Symbol()==symbol && m_position.Magic()==m_magic)
if(m_position.PositionType()==pos_type) // gets the position type
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
Эту функцию вставьте, пожалуйста, в самый конец программы.
Остаётся прописать пару строк вызова функции "ClosePositions":
{
double lot=m_symbol.LotsMin();
double price=m_symbol.Ask();
//--- close all Sell positions
ClosePositions(POSITION_TYPE_SELL,m_symbol.Name(),InpMagic);
//---
if(m_trade.Buy(lot,NULL,price)) // successful check of the structures
if(m_trade.ResultDeal()!=0) // deal ticket if the deal is executed
TradeIsAllowed=false; // trade is forbidden
}
if(open>close && open-close>ExtSizeOfBar) // Sell
{
double lot=m_symbol.LotsMin();
double price=m_symbol.Bid();
//--- close all Buy positions
ClosePositions(POSITION_TYPE_BUY,m_symbol.Name(),InpMagic);
//---
if(m_trade.Sell(lot,NULL,price)) // successful check of the structures
if(m_trade.ResultDeal()!=0) // deal ticket if the deal is executed
TradeIsAllowed=false; // trade is forbidden
}
Сохраняем версию 1.09. Это всё.
Не понимаю, что Вы так прицепились к слову "Стандартная библиотека"? Тем более, что любой класс - это ни в коем случае не чёрный ящик - все файлы открыты, доступны и всегда можно просмотреть реализацию методов.
Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - но это не совсем другая история и не в контексте данного топика.
Ты даже себе представить не можешь насколько часто и активно те, кого ты называешь боящимися ООП, используют его в своих mql4 и mql5 разработках. Причём по-разному - как некоторые классы из СБ, так и свои собственные, либо унаследованные от классов СБ. Только пишут они сами, и знают всё сами, и не на том уровне, как пишешь ты свои коды - ты ничего сам не пишешь - ты кубики складываешь. И, соответственно, растишь своё поколение идиотов, которые кроме как сложить из кубиков больше ничего и не смогут - ведь ты их другому-то и не научил.
Вот если бы ты начал расписывать подробно устройство и работу СБ шаг за шагом, класс за классом, так же наглядно, на пальцах и в картинках, вот тогда бы твой труд был ценен и уважаем - реально люди сами разбираются в СБ - нет нормального описания для новичков.
Ты же, мало того, что делаешь какой-то абстрактный глупый советник (наверное это следствие того, что сам не торгуешь, и никогда не торговал), так ты ещё и просто его из кубиков складываешь. Ощущение, прошу прощения, детского сада, а не серьёзного ресурса...
ЗЫ. Вот ты считаешь, что на тебя тут "спаммеры наехали, тролляки гадские", а тебе просто пытаются донести, что не в ту степь ты тратишь свои силы - в воду всё...
Шаг 11: Работаем только на hedge-счетах.
Остался последний нюанс - нужно безжалостно отсечь попытки запускать советник на netting торговых счетах. Для этого введём переменную "m_margin_mode" с типом ENUM_ACCOUNT_MARGIN_MODE:
double ExtSizeOfBar=0.0; //
bool TradeIsAllowed=true; //
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
и две функции: установка значения нашей переменной "m_margin_mode"
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
и проверка типа торгового счёта:
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
Функции "SetMarginMode" и "IsHedging" скопируйте в самый конец советника.
Теперь пропишем вызовы этих двух функций:
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
//---
m_trade.SetExpertMagicNumber(InpMagic); // sets magic number
Теперь советник при попытке запуска на netting счетах будет выгружаться с сообщением об ошибке:
Сохраним версию 1.10 в Хранилище.
Здесь я вижу другую причину - более глубинную - это "четвёрочный" страх перед ООП - ...
Что-то нигде, ни в одном вашем примере не видел, чтобы вы использовали ООП.
В данном примере выше, в своих кодах в Кодабазе -- вы используете методы из СБ как функции для процедурного программирования.
Карпутов, можете дать ссылку на свой пример, где вы используете ООП, создаёте экземпляры классов? Есть такой пример?
Шаг 11: Работаем только на hedge-счетах.
Остался последний нюанс - нужно безжалостно отсечь попытки запускать советник на netting торговых счетах. Для этого введём переменную "m_margin_mode" с типом ENUM_ACCOUNT_MARGIN_MODE:
double ExtSizeOfBar=0.0; //
bool TradeIsAllowed=true; //
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
и две функции: установка значения нашей переменной "m_margin_mode"
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
и проверка типа торгового счёта:
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
Функции "SetMarginMode" и "IsHedging" скопируйте в самый конец советника.
Теперь пропишем вызовы этих двух функций:
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
//---
m_trade.SetExpertMagicNumber(InpMagic); // sets magic number
Теперь советник при попытке запуска на netting счетах будет выгружаться с сообщением об ошибке:
Сохраним версию 1.10 в Хранилище.
Это всё-равно что чесать правое ухо левой ногой... Всё что тут написано умещается в одно условие.
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
Print("Hedging only!");
return(INIT_FAILED);
}
}
Чего ради городить огород из лего??? Видимо такое поколение... ЕГЭ и лего.