Как создать функцию? - страница 2

 
drknn писал (а):
... Если объявлять переменные и там и там, то выходит полная фигня - например, у меня функция не должна возвращать ни каких значений, а просто обработать группу переменных и присвоить им некоторые значения. Если объявлять эти переменные и там и там, то советник, обработав их присвоит им некоторые значения. Далее идёт запос нашей функции, где переменые объявляются заново (то есть, выходит, что они обнуляются).
Переменные в библиотечной функции (формальные параметры) не обнуляются, а им присваются значения, передаваемые при вызове функции (фактические значения). Для примера, фунция трейлинга, используемая мной во многих советниках:
//+------------------------------------------------------------------+
//|                                                    MyLibrary.mq4 |
//|                                                          Valmars |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Valmars"
#property link      "valmars@bk.ru"
#property library 
#include <stderror.mqh> 
#include <stdlib.mqh>
 
//+------------------------------------------------------------------+
//|void TrailingPositions() function                                 |
//+------------------------------------------------------------------+
void TrailingPositions(string symbol,int MinProfit,int TrailingStop,int TrailingStep) 
{
  int cnt = OrdersTotal();
 
  for (int i=0; i<cnt; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) 
      {int error_code = GetLastError();
  Print("Error OrderSelect function: ", ErrorDescription(error_code), " (", error_code, ")");
  return ;
      }
    if (OrderSymbol() !=symbol) continue;        
 
    if (OrderType() == OP_BUY) {
      if (MarketInfo( symbol, MODE_BID) -OrderOpenPrice()- NormalizeDouble(MinProfit*MarketInfo( symbol, MODE_POINT),Digits) > 0) {
        if (OrderStopLoss()- MarketInfo( symbol, MODE_BID)+(TrailingStop+TrailingStep)*MarketInfo( symbol, MODE_POINT)< 0) {
         double SL=NormalizeDouble(MarketInfo( symbol, MODE_BID)-TrailingStop*MarketInfo( symbol, MODE_POINT),Digits);
        if (!OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0, Blue))
         {error_code = GetLastError();
  Print("Error modify order : ", ErrorDescription(error_code), " (", error_code, ")");
  Sleep(10000);RefreshRates( );
  return ;
          }  
        }
      } 
    }
 
    if (OrderType() == OP_SELL) {
      if (OrderOpenPrice()-MarketInfo( symbol, MODE_ASK) - NormalizeDouble(MinProfit*MarketInfo( symbol, MODE_POINT),Digits)> 0) {
        if (OrderStopLoss()-MarketInfo( symbol, MODE_ASK)- (TrailingStop+TrailingStep)*MarketInfo( symbol, MODE_POINT)> 0 || OrderStopLoss() == 0) {
         SL=NormalizeDouble(MarketInfo( symbol, MODE_ASK)+TrailingStop*MarketInfo( symbol, MODE_POINT),Digits);
        if (!OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0, Blue))
         {error_code = GetLastError();
  Print("Error modify order : ", ErrorDescription(error_code), " (", error_code, ")");
  Sleep(10000);RefreshRates( );
  return ;
         }
        }
      }
    }
  }
return ;
}
Используется в виде:
...
extern string _Param_Trailing_ = " --- Параметры трейлинг-стопа ---";
extern bool UseTrailing = true;
extern int MinProfit = 70;
extern int TrailingStop = 70;
extern int TrailingStep = 10;
...
#import "MyLibrary.ex4"
   void TrailingPositions(string symbol,int MinProfit,int TrailingStop,int TrailingStep);
#import 
...
void start() {
...
if (UseTrailing && TrailingStop>MarketInfo(symbol,MODE_STOPLEVEL))
    {TrailingPositions(symbol,MinProfit,TrailingStop,TrailingStep);
...
return;}
В функцию передаются значения MinProfit = 70;TrailingStop = 70;TrailingStep = 10;
а она уже передвигает стоп-лосс
 
Дело в том, что я не использовал передачу параметров в функцию. Прийдётся это делать. Деваться некуда. Спасибо за ответ.
Причина обращения: